현대 목표 C 런타임에서 IVAR 합성을위한 기본 메커니즘은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/275034

  •  07-07-2019
  •  | 
  •  

문제

최신 (64 비트 OS X 및 iPhone OS) 목표 C 런타임의 특징 중 하나는 IVAR을 명시 적으로 선언하지 않고 IVAR을 동적으로 합성 할 수있는 기능입니다.

@interface MyClass : NSObject {
//  NSString *name; unnecessary on modern runtimes
}

@property (retain) NSStrng *name;

@end

@implementation MyClass

@synthesize name;

@end

내 코드의 약간의 코드에서는 속성을 초기화하기 위해 Custom Getter 구현을 사용합니다.

- (NSString *) name {
  if (!name) {
    name = @"Louis";
  }

  return name;
}

상기는 헤더에 선언되지 않은 IVAR에 액세스해야하므로 합성 된 IVAR과 호환되지 않습니다. 여러 가지 이유로 현대적인 런타임을 구축 할 때 합성 된 IVAR을 사용하기 위해 여러 개인 프레임 워크를 업데이트하고 싶습니다. 위의 코드는 합성 IVAR과 함께 작동하도록 수정되어야합니다.

목적 C 2.0 문서화에 따르면 최신 런타임의 합성 된 액세서가 처음으로 IVAR을 합성 할 것이라고 명시하고 있습니다. 이를 수행하는 데 사용되는 낮은 레벨 메커니즘을 지정하지 않습니다. class_getInstanceVariable ()에 의해 수행됩니까? class_addivar ()의 제한이 느슨해 졌습니까? 속성을 뒷받침하는 데이터에 대한 내 자신의 측면 스토리지를 구현할 수는 있지만 합성 된 액세서가 사용하는 메커니즘을 사용합니다.

도움이 되었습니까?

해결책

나는 지금 방금 문서를 다시 보았고, 당신이 그것을 잘못 읽고 있다고 생각합니다. 합성 된 IVAR은 런타임이 아닌 컴파일 시간에 생성됩니다.

에 따르면 대상 C 2.0 문서:

런타임에 의존하는 동작에는 차이가 있습니다 ( "런타임 차이"참조) :

레거시 런타임의 경우 인스턴스 변수는 이미 @interface 블록에 선언되어야합니다. 속성과 동일한 이름과 호환 유형의 인스턴스 변수가 존재하는 경우,이 제품이 사용됩니다. 즉, 컴파일러 오류가 발생합니다.

최신 런타임의 경우 인스턴스 변수가 필요에 따라 합성됩니다. 동일한 이름의 인스턴스 변수가 이미 존재하는 경우 사용됩니다.

따라서 필요한 인스턴스 변수를 선언하기 만하면 동일한 코드가 두 Runtimes에서 작동합니다 ...

다른 팁

당신이 찾고있는 것은 @synthesized 이름입니다.

@synthesize name = _name;

...

- (NSString *) name {
    if (!name) {
        _name = @"Louis";
    }

    return _name;
}

당신은 런타임에 속성을 추가합니다 nskeyvaluecoding 프로토콜.

[myObject setValue:@"whatever" forKey:@"foo"];
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top