OC에서 속성을 추가할 수 없는 이유

1496 단어
Clang으로 나를 컴파일했어.m 파일[clang-rewrite-objc MyObject.m]이 생성됩니다.cpp 파일
컴파일러가 나의 대상 MyObject를 아래의 구조체 MyObject 로 바꾸었다IMPL
struct MyObject_IMPL {
    struct NSObject_IMPL NSObject_IVARS;
    NSInteger *_i;
    NSString * _Nonnull _ogTxt;
    NSString * _Nonnull _exTxt;
};

NSObject_IMPL
struct NSObject_IMPL {
    Class isa;
};

isa는 Class 유형, Class는 objcclass 형식의 포인터
// Class  objc_class    
typedef struct objc_class *Class;

struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};
//  objc_class    objc_object
struct objc_class : objc_object {
    // Class ISA;
    Class superclass;
    cache_t cache;             // formerly cache pointer and vtable
    class_data_bits_t bits;    // class_rw_t * plus custom rr/alloc flags
    ...
};

extension은 익명의 category처럼 보이지만, extension과 이름이 있는 category는 거의 두 가지입니다.extension는 컴파일링 기간에 대한 결의입니다. 이것은 클래스의 일부분입니다. 컴파일링 기간과 헤더 파일의 @interface, 그리고 파일의 @implement를 실현하는 것과 함께 완전한 클래스를 형성합니다. 클래스의 생성과 함께 생성되고 사라집니다.extension는 일반적으로 클래스의 개인 정보를 숨기는 데 사용됩니다. 클래스의 원본이 있어야 클래스에 extension을 추가할 수 있기 때문에 시스템의 클래스인 NSString에 extension을 추가할 수 없습니다.
그러나 category는 완전히 다르다. 그것은 운행 기간에 결의된 것이다.category와 extension의 차이를 보면 extension는 실례 변수를 추가할 수 있지만 category는 실례 변수를 추가할 수 없다. (실행 기간에 대상의 메모리 레이아웃이 확정되었기 때문에 실례 변수를 추가하면 클래스의 내부 레이아웃을 파괴할 수 있다. 이것은 컴파일러 언어에 재난적이다.)
왜 재난적이라고 해요?메모리에 이미 존재하는 이런 대상은 어떻게 처리해야 합니까?
그럼objcsetassociatedObject는 어떻게 이루어졌을까요?답을 찾다

좋은 웹페이지 즐겨찾기