2012-07-20 5 views
2

에서 "동적". 제가 말할 수있는 한, 저는 이것을위한 세 가지 선택이 있습니다. - (NSObject *)theObject & - (void)setTheObject:(NSObject *)object 대한 설명은, "합성하여", 그리고 오브젝티브 C 2.0

  • 사용 @synthesize

    • 수동으로 코드를 구현 자동으로 자동으로 내가 무시하도록 선택하지 않은 두 가지 방법 중 하나를 생성하는 모두 방법, 또는
    • 사용 @dynamic를 생성합니다.

    이 내용을 올바르게 이해하고 있습니까? 또한 서로 다른 @property 인수를 사용하면 @synthesize & @dynamic의 결과에 어떻게 영향을 줍니까? (예를 들어, nonatomic & weak)

  • 답변

    2

    당신은 @synthesize@dynamic의 차이를 오해했다.

    @synthesize은 getter 및/또는 setter가 아직 수동으로 구현되지 않은 경우 속성의 getter 및 setter 메서드를 생성합니다. 이것은 현재 @dynamic이 믿는 것입니다.

    @dynamic은 런타임에서 자동으로 getter 및 setter를 생성하지 않고 수동으로 구현하지 않으려는 경우에 사용됩니다. 기본적으로 @dynamic은 일종의 런타임 인 ​​마법을 사용하여 런타임에 getter/setter가 동적으로 제공된다는 것을 컴파일러에 알려주고 있습니다.

    예를 들어, Objective-C Runtime Programming Guide는 말한다 :

    You can implement the methods `resolveInstanceMethod:` and `resolveClassMethod:` 
    to dynamically provide an implementation for a given selector for an instance 
    and class method respectively. 
    

    나는이 훨씬 더 자세히 방법을 설명대로 The Objective-C Programming 언어의 Declared Properties 섹션을 읽어 제안 @property, @synthesizenonatomic 같은 모든 속성과 함께 @dynamic 일 및 weak.

    +0

    이가 그러나 원래이 오류 메시지는 '쓰기 가능한 원자 속성 theObject는 합성 된 게터를 사용자 정의 된 설정자와 쌍으로 만들 수 없습니다.'라는 다른 이야기를 전합니다. – Itoqixer

    +2

    나는 이것이 오류 메시지가 말했듯이 원자 속성이라고 생각하기 때문이다.Objective-C는 사용자가 자신의 설정자를 정의 할 경우 원 자성 보장을 유지할 수 없습니다. 비 원자력으로 시도하십시오. –

    2

    @dynamic은 런타임에 접근 자 메서드가 제공된다는 것을 컴파일러에 알립니다.

    약간의 조사로 접근 자 메서드를 제공하면 @dynamic 지시어보다 우선 함을 알 수있었습니다.

    @synthesize

    당신을 위해 그 접근을 만들 수있는 컴파일러 (getter 및 setter)

    @property는 접근이 생성됩니다 컴파일러를 알려줍니다, 그리고 그 점 표기법으로 액세스 할 수 있습니다 또는 [object message]