iOS Runtime 노트
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.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.