이 봉 봉 봉 블 로그 노트 를 읽 는 RunTime 의 중요 한 데이터 구조
Objective - C 와 다른 정적 언어의 차이
1. OC 와 Runtime 시스템 의 상호작용 세 가지 방식
1、SEL
typedef struct objc_selector *SEL;
2、id
typedef struct objc_object *id;
struct objc_object {
Class isa;
};
이상 정의, obbc 보기object 구조 체 는 isa 지침 을 포함 하고 있 으 며, isa 지침 에 따라 대상 이 속 한 종 류 를 찾 을 수 있 습 니 다.
3、Class
typedef struct objc_class *Class;
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class super_class ( )
const char *name( )
/* 。 , 。 */
long version( )
long info( )
long instance_size( )
struct objc_ivar_list *ivars( )
struct objc_method_list **methodLists( )
struct objc_cache *cache( )
struct objc_protocol_list *protocols( )
#endif
} OBJC2_UNAVAILABLE;
struct objc_ivar_list {
int ivar_count OBJC2_UNAVAILABLE;
#ifdef __LP64__
int space OBJC2_UNAVAILABLE;
#endif
/* variable length structure */
struct objc_ivar ivar_list[1]
}
typedef struct objc_ivar *Ivar;
struct objc_ivar {
char *ivar_name OBJC2_UNAVAILABLE;
char *ivar_type OBJC2_UNAVAILABLE;
int ivar_offset OBJC2_UNAVAILABLE;
#ifdef __LP64__
int space OBJC2_UNAVAILABLE;
#endif
}
struct objc_method_list {
/* *obsolete */
struct objc_method_list *obsolete OBJC2_UNAVAILABLE;
int method_count OBJC2_UNAVAILABLE;
#ifdef __LP64__
int space OBJC2_UNAVAILABLE;
#endif
/* variable length structure */
struct objc_method method_list[1] OBJC2_UNAVAILABLE;
}
typedef struct objc_method *Method;
struct objc_method {
/* */
SEL method_name OBJC2_UNAVAILABLE;
/* method_types char , */
char *method_types OBJC2_UNAVAILABLE;
/* , */
IMP method_imp OBJC2_UNAVAILABLE;
}
typedef id (*IMP)(id, SEL, ...);
그것 은 바로 함수 포인터 이다. 이것 은 컴 파일 러 에 의 해 생 성 된 것 이다.ObjC 메 시 지 를 보 낸 후에 최종 적 으로 실 행 될 코드 는 이 함수 포인터 가 지정 한 것 입 니 다.IMP 라 는 함수 지침 은 이 방법의 실현 을 가리킨다.IMP 가 가리 키 는 방법 과 obbc 를 발견 할 수 있 습 니 다.msgSend 함수 형식 이 같 고 매개 변 수 는 id 와 SEL 형식 을 포함 합 니 다.모든 방법 명 은 하나의 SEL 형식의 방법 선택 기 에 대응 하고 모든 인 스 턴 스 대상 의 SEL 에 대응 하 는 방법 은 유일한 것 이 며, 하나의 id 와 SEL 매개 변 수 를 통 해 유일한 방법 으로 주 소 를 실현 할 수 있 습 니 다.
typedef struct objc_cache *Cache
struct objc_cache {
unsigned int mask /* total = mask + 1 */ OBJC2_UNAVAILABLE;
unsigned int occupied OBJC2_UNAVAILABLE;
Method buckets[1] OBJC2_UNAVAILABLE;
};
typedef struct objc_property *Property;
typedef struct objc_property *objc_property_t;//
objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)
#import
@interface Person : NSObject
/** */
@property (strong, nonatomic) NSString *name;
/** age */
@property (assign, nonatomic) int age;
/** weight */
@property (assign, nonatomic) double weight;
@end
이상 은 하나의 Person 클래스 로 3 개의 속성 이 있 습 니 다.위 와 같은 방법 으로 클래스 의 운행 시 속성 을 가 져 옵 니 다.
unsigned int outCount = 0;
objc_property_t *properties = class_copyPropertyList([Person class], &outCount);
NSLog(@"%d", outCount);
for (NSInteger i = 0; i < outCount; i++) {
NSString *name = @(property_getName(properties[i]));
NSString *attributes = @(property_getAttributes(properties[i]));
NSLog(@"%@--------%@", name, attributes);
}
인쇄 결 과 는 다음 과 같 습 니 다.
2016-12-17 11:27:28.473 test[2321:451525] 3
2016-12-17 11:27:28.473 test[2321:451525] name--------T@"NSString",&,N,V_name
2016-12-17 11:27:28.473 test[2321:451525] age--------Ti,N,V_age
2016-12-17 11:27:28.474 test[2321:451525] weight--------Td,N,V_weight
property_getName 속성 이름 을 찾 으 려 면 c 문자열 을 되 돌려 줍 니 다.property_getAttributes 함수 가 속성의 실제 이름과 @ encode 형식 을 발굴 하여 c 문자열 을 되 돌려 줍 니 다.
objc_property_t *protocol_copyPropertyList(Protocol *proto, unsigned int *outCount)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.