OC 기본 Category 및 Extension의 차이점

2969 단어

Category 및 Extension 소개


Category
  • 는 현재 알려진 클래스에 방법(클래스 방법과 실례 방법)을 추가할 수 있다. 이 클래스는 사용자 정의 클래스일 수도 있고 시스템 자체 클래스일 수도 있다.추가된 방법과 클래스의 원래 방법이 이름이 바뀌면 클래스의 원래 방법을 덮어씁니다.

  • 원래의 방법은 여전히 존재한다. 결코 정말로 덮어씌운 것이 아니다.실행할 때 대상에게 메시지를 보내면 대상의'isa'지침에 따라 속하는 클래스를 찾은 다음에 클래스의 방법 목록에서 방법명에 따라 찾다가 첫 번째를 찾으면 되돌아오고category를 통해 추가한 방법은 방법 목록의 맨 위에 있기 때문에 클래스의 원래 방법을 찾을 기회가 없습니다."
  • property를 통해 속성을 추가할 수 있으나 속성의 set, get 방법에 대한 설명일 뿐 실현되지 않고 밑줄을 가진 변수를 생성할 수 없습니다.
  • 구성원 변수를 추가할 수 없습니다.runtime 관련 대상을 통해 추가된 것은 속성도, 구성원 변수도 아니다. 이것은 현재 클래스와 근본적인 관계가 없고 단지 함께 연결되어 있을 뿐이다.

  • Extension
  • 이미 알고 있는 클래스에 추가할 수 있는 방법(클래스 방법과 실례 방법), 이 클래스는 사용자 정의 클래스일 뿐 시스템 자체 클래스일 수 없습니다. .m 파일을 얻을 수 없기 때문입니다.이미 알고 있는 종류 때문에.m에서 조작하기 때문에 외부에 방법이나 변수를 숨겨서 사유로 만들 수 있다.
  • 는 속성과 구성원 변수를 추가할 수도 있고 속성에 set, get 방법과 기본적인 실현을 생성할 수도 있다.extension을 통해 추가하는 방법과 변수는 정말 현재 클래스의 일부분이 되었습니다.

  • 차이점


    eg: 사용자 정의 User 클래스에 Category, Extension 추가
    //Category
    @interface User (InnterAdd)
    -(void)test;
    @end
    @implementation User (InnterAdd)
    
    -(void)test
    {
        NSLog(@":%s",__func__);
    }
    
    @end
    
    //Extension
    @interface User ()
    
    @property (copy)NSString * addr;
    
    @end
    
    

    표현 형식상,Category는 명칭이 있고, 자신만의 것이 있다.m 파일, extension에는 이름이 없습니다. 익명으로 보이는 분류가 없습니다. 없습니다.m 파일.Category도 이름이 없으면 둘 다 표현할 수 있다.Category:는 실행할 때 불러오기 처리된 것으로 이 과정에서 추가된 방법을 클래스의 방법 목록에 추가한다. 클래스의 메모리 구조 구조는 컴파일 시기에 확정된 것이기 때문에 실행할 때 실례 변수를 추가할 수 없다. 그렇지 않으면 메모리 구조를 파괴한다(불법 메모리 주소에 예측할 수 없는 오류가 존재하기 때문에 금지된다).그럼 왜 방법을 추가할 수 있고 멤버 변수를 추가할 수 없나요?runtime층에서 category는 구조체 categoryt(objc-runtime-new.h에서 이 정의를 찾을 수 있음)는 다음과 같습니다.
    typedef struct category_t {
        const char *name;
        classref_t cls;
        struct method_list_t *instanceMethods;
        struct method_list_t *classMethods;
        struct protocol_list_t *protocols;
        struct property_list_t *instanceProperties;
    } category_t;
    

    이를 통해 실례 방법, 유형 방법, 심지어 협의를 실현하고 속성을 추가할 수 있음을 알 수 있다.실례 변수를 나타내는 저장이 없습니다.
    사실 분류 자체는 하나의 클래스가 아니다. 분류, 분류의 일부 조작은 실행할 때 주요 클래스에 방법, 속성, 또는 협의의 조작이나 대외적으로 제공된 인터페이스 확장이다. 분류에 추가된 방법은 원래의 방법 목록에 직접 귀속된다.그래서 분류라는 이름을 로 바꾸는 것이 더 쉽게 이해할 수 있을 것 같아서(o)/~라는 점에서 Category와 Extension은 목적적으로 일치하고 기존의 클래스에 새로운 조작을 추가하는 것이다.Extension: 컴파일할 때 처리되는 첨가된 변수와 방법은 클래스와 밀접하게 결합되어 클래스의 일부분이며 클래스가 사라지면 클래스도 사라진다.

    Category의 연결 객체


    runtime는 다음과 같은 세 가지 방법을 제공했다
    void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
    objc_getAssociatedObject(id object, const void *key)
    void objc_removeAssociatedObjects(id object)
    
    

    그 중에서 objc_removeAssociatedObjects 추가된 모든 대상을 제거하기 때문에 실제 작업은 다른 곳에 추가된 관련도remove에 주지 않도록 주의해야 한다.그래서 objc_setAssociatedObject를 통해nil로 직접 설치하는 것이 더 믿을 만하다.

    #END


    이전 질문:OC 면접기초(1)-@property 키워드 및 수식자 알려주세요.

    좋은 웹페이지 즐겨찾기