이 봉 봉 봉 블 로그 노트 를 읽 는 RunTime 의 중요 한 데이터 구조

7007 단어
봉 신 블 로그 주소
Objective - C 와 다른 정적 언어의 차이
  • Objective - C 는 컴 파일 과 링크 시기 에 하 는 일 을 실행 할 때 처리 합 니 다.
  • 즉, 운행 시 구 조 를 바 꿀 수 있다
  • .
  • 새로운 함수 가 실 행 될 때 도 입 될 수 있 습 니 다
  • 기 존 함수 삭제 가능
  • 두 가지 방법의 실현 등 을 교환 할 수 있다

  • 1. OC 와 Runtime 시스템 의 상호작용 세 가지 방식
  • OC 소스 코드
  • 를 통 해
  • Foundation 프레임 워 크 의 NSObject 클래스 를 통 해 정의 하 는 방법
  • - class 반환 대상 의 클래스;
  • - isKindOfClass: 와 - isMemberOfClass: 방법 검사 대상 이 지정 한 클래스 의 계승 시스템 에 존재 하 는 지 (하위 클래스 나 부모 클래스 또는 현재 클래스 의 구성원 변수 인지)
  • - responds ToSelector: 대상 이 지정 한 메시지 에 응답 할 수 있 는 지 확인 합 니 다
  • - conforms ToProtocol: 대상 이 지정 한 프로 토 콜 류 의 방법 을 실 현 했 는 지 검사 합 니 다.
  • - methodForSelector: 지정 한 방법 으로 이 루어 진 주 소 를 되 돌려 줍 니 다.

  • 3. Runtime 라 이브 러 리 함수 에 대한 직접 호출
  • Runtime 관련 용어 및 데이터 구조
    1、SEL
  • SEL 은 selector 가 Objc 에서 나타 내 는 표현 (Swift 에서 Selector 류) 이다.selector 는 대응 하 는 방법 을 찾 을 수 있 도록 방법 명 을 포장 합 니 다.그것 의 데이터 구 조 는
  • typedef struct objc_selector *SEL;
    
  • SEL 획득 방법 은
  • Objc 컴 파일 러 명령 @ selector ()
  • 을 통 해
  • 런 타임 시스템 을 통한 selregisterName 함 수 는 SEL 형식의 방법 선택 기 를 가 져 옵 니 다.


  • 2、id
  • id 는 매개 변수 형식 으로 특정한 인 스 턴 스 를 가리 키 는 지침 입 니 다.정 의 는 다음 과 같다
  • typedef struct objc_object *id;
    struct objc_object { 
        Class isa; 
    };
    

    이상 정의, obbc 보기object 구조 체 는 isa 지침 을 포함 하고 있 으 며, isa 지침 에 따라 대상 이 속 한 종 류 를 찾 을 수 있 습 니 다.
    3、Class
  • 데이터 구 조 는 다음 과 같다.
  • typedef struct objc_class *Class;
    
  • Class 는 사실 obbcclass 구조 체 의 지침.objc_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 * ivars (구성원 변수 목록)
  • 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] 
     }  
    
  • Ivar 는 구성원 변 수 를 나타 내 는 유형 이다.
  • 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 * * methodLists (방법 목록)
  • 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;
    }
    
  • Method 대표 클래스 중 어떤 방법의 유형
  • 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;
    }
    
  • IMP 구조
  • 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;
    };
    
  • Property 정 의 는 다음 과 같다
  • typedef struct objc_property *Property;
    typedef struct objc_property *objc_property_t;//     
    
  • 클 라 스copy Property List 방법 으로 클래스 의 속성 획득 objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)
  • 속성 목록 을 되 돌려 줍 니 다. 목록 에 있 는 모든 요 소 는 obj c 입 니 다.property_t 지침, 방법 사용 예 는 다음 과 같다.
  • #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 문자열 을 되 돌려 줍 니 다.
  • protocol 을 통 해copy Property List 방법 으로 프로 토 콜 의 속성 가 져 오기 objc_property_t *protocol_copyPropertyList(Protocol *proto, unsigned int *outCount)
  • 좋은 웹페이지 즐겨찾기