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