iOS Runtime 노트

6081 단어
Objective-C 언어는 많은 정적 언어가 컴파일링과 링크 시기에 하는 일을 실행할 때 처리하는 동적 언어입니다.이런 동적 언어의 장점은 우리가 코드를 쓸 때 더욱 유연성을 가진다는 데 있다. 예를 들어 우리는 정보를 우리가 원하는 대상에게 전달하거나 한 방법을 마음대로 교환하는 실현 등이다.
Objective-C 클래스는 Class 유형으로 표시되며 실제로는 objc 를 가리킨다class 구조체의 지침입니다.정의는 다음과 같습니다.
typedef struct objc_class *Class;

objc/runtime 보기.h중objcclass 구조체의 정의는 다음과 같습니다.
struct objc_class {
Class isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
Class super_class                       OBJC2_UNAVAILABLE;  //   
const char *name                        OBJC2_UNAVAILABLE;  //   
long version                            OBJC2_UNAVAILABLE;  //       ,   0
long info                               OBJC2_UNAVAILABLE;  //    ,            
long instance_size                      OBJC2_UNAVAILABLE;  //          
struct objc_ivar_list *ivars            OBJC2_UNAVAILABLE;  //          
struct objc_method_list **methodLists   OBJC2_UNAVAILABLE;  //        
struct objc_cache *cache                OBJC2_UNAVAILABLE;  //     
struct objc_protocol_list *protocols    OBJC2_UNAVAILABLE;  //     
#endif

} OBJC2_UNAVAILABLE;

1、
상용 예시
Class newClass = objc_allocateClassPair([NSError class], "TestClass", 0); //      

매개 변수 1: 상위 매개 변수 2: 하위 클래스 이름 매개 변수 3:extraBytes
class_addMethod(newClass, @selector(testMetaClass), (IMP)TestMetaClass, "v@:"); //         

매개변수 1: 클래스 이름 매개변수 2: 메소드 이름 매개변수 3: 메소드(IMP)네가 쓴 방법명 매개 변수 4: 이 함수의 반환값 유형과 매개 변수 유형을 정의하는 문자열은 반환값과 매개 변수의 동태적 확정에 따라 반환값 유형의 표현방법을 볼 수 있다. 여기에서 반환값 유형에 대한 표현방법 v는void의 뒤쪽을 나타낸다. 뒤쪽은 참수를 나타낸다. 예를 들어 정의int:(id self, SEL _cmd,NSString * name)라면 i@:@와 같다.
objc_registerClassPair(newClass); //       
id instance = [[newClass alloc] initWithDomain:@"some domain" code:0 userInfo:nil]; //      
[instance performSelector:@selector(testMetaClass)]; //     

//       
const char * class_getName ( Class cls );


//       
Class class_getSuperclass ( Class cls );

//      Class       
BOOL class_isMetaClass ( Class cls );

//       

size_t class_getInstanceSize ( Class cls );

objcclass에서 모든 구성원의 변수, 속성 정보는 체인 테이블 ivars에 있습니다.ivars는 하나입니다.
//                  
Ivar class_getInstanceVariable ( Class cls, const char *name );

//           
Ivar class_getClassVariable ( Class cls, const char *name );

//       
BOOL class_addIvar ( Class cls, const char *name, size_t size, uint8_t alignment, const char *types );

//           
Ivar * class_copyIvarList ( Class cls, unsigned int *outCount );

class_copyIvarList 함수, 구성원 변수 정보를 가리키는 그룹을 되돌려줍니다. 그룹의 모든 요소는 이 구성원 변수 정보를 가리키는 objcivar 구조체의 지침입니다.이 그룹은 부모 클래스에 설명된 변수를 포함하지 않습니다.outCount 포인터가 배열의 크기를 반환합니다.주의해야 할 것은free () 를 사용하여 이 그룹을 풀어야 한다는 것이다
//        
objc_property_t class_getProperty ( Class cls, const char *name );

//       
objc_property_t * class_copyPropertyList ( Class cls, unsigned int *outCount );

//       
BOOL class_addProperty ( Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount );

//       
void class_replaceProperty ( Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount );


//     
BOOL class_addMethod ( Class cls, SEL name, IMP imp, const char *types );

//       
Method class_getInstanceMethod ( Class cls, SEL name );

//      
Method class_getClassMethod ( Class cls, SEL name );

//          
Method * class_copyMethodList ( Class cls, unsigned int *outCount );

//        
IMP class_replaceMethod ( Class cls, SEL name, IMP imp, const char *types );

//          
IMP class_getMethodImplementation ( Class cls, SEL name );
IMP class_getMethodImplementation_stret ( Class cls, SEL name );

//           selector
BOOL class_respondsToSelector ( Class cls, SEL sel );

class_addMethod의 실현은 부모 클래스의 방법을 덮어쓰지만, 이 클래스에 이미 존재하는 실현을 대체하지 않습니다. 이 클래스에 같은 이름의 실현이 포함되면 함수는 NO로 되돌아옵니다.이미 존재하는 것을 수정하려면methodsetImplementation.하나의 Objective-C 방법은 간단한 C 함수로 적어도 두 개의 인자를 포함한다-self와cmd.따라서 구현 함수(IMP 매개변수가 가리키는 함수)에는 다음과 같이 최소 두 개의 매개변수가 필요합니다.
void myMethodIMP(id self, SEL _cmd)
{
// implementation ....
}


//     
BOOL class_addProtocol ( Class cls, Protocol *protocol );

//             
BOOL class_conformsToProtocol ( Class cls, Protocol *protocol );

//           
Protocol * class_copyProtocolList ( Class cls, unsigned int *outCount );


//      
int class_getVersion ( Class cls );

//      
void class_setVersion ( Class cls, int version );

//          
Class objc_allocateClassPair ( Class superclass, const char *name, size_t extraBytes );

//             
void objc_disposeClassPair ( Class cls );

//        objc_allocateClassPair    
void objc_registerClassPair ( Class cls );

//      
id class_createInstance ( Class cls, size_t extraBytes );

//           
id objc_constructInstance ( Class cls, void *bytes );

//      
void * objc_destructInstance ( id obj );


//            
id object_copy ( id obj, size_t size );

//            
id object_dispose ( id obj );

//             
Ivar object_setInstanceVariable ( id obj, const char *name, void *value );

//           
Ivar object_getInstanceVariable ( id obj, const char *name, void **outValue );

//                     
void * object_getIndexedIvars ( id obj );

//            
id object_getIvar ( id obj, Ivar ivar );

//            
void object_setIvar ( id obj, Ivar ivar, id value )


//          
const char * object_getClassName ( id obj );

//       
Class object_getClass ( id obj );

//       
Class object_setClass ( id obj, Class cls );


//             
int objc_getClassList ( Class *buffer, int bufferCount );

//                     
Class * objc_copyClassList ( unsigned int *outCount );

//          
Class objc_lookUpClass ( const char *name );
Class objc_getClass ( const char *name );
Class objc_getRequiredClass ( const char *name );

//         
Class objc_getMetaClass ( const char *name );

_iOS.Dev GoodMood.

좋은 웹페이지 즐겨찾기