2013-10-22 3 views
0

Objective-C 속성은 런타임에 무엇이 해결 되나요? [obj valueForKey : @ "property"]를 호출해도 항상 같은 결과가 나타 납니까?Objective-C 속성은 런타임에 무엇이 해결 되나요?

obj.property

+1

애플 문서의 어딘가에서'valueForKey'가 어떻게 다른 플랫폼에서 작동하는지 설명했습니다. –

+0

누군가가 아래쪽 투표에 반대 할 수 있습니까? 이것은 합법적 인 코딩 질문입니다! – Boon

답변

2

먼저 obj.property은 정확히 [obj property]과 같습니다. 점 신텍스는 문법적 설탕 일뿐입니다. 이 토론의 목적을 위해 다른 메소드와 다른 속성에 관련된 작은 런타임 구현 세부 사항이 있지만 "나는 _key이라는 이름의 이븐과 -key이라는 메소드라는 측면에서만 생각하면됩니다." 속성을 선언하여 해당 ivar 및 메서드를 만든 사실은 valueForKey:과 관련이 없습니다.

valueForKey:은 메소드이며 원하는 클래스를 반환하기 위해 클래스에 의해 재정의 될 수 있습니다. 의 기본값 인의 동작은 valueForKey:이 먼저 이름이 키와 일치하는 메서드를 찾고 그 결과를 반환합니다. 대다수의 경우, 이는 자산이있는 경우 valueForKey:@"property"이 값을 반환한다는 것을 의미합니다.

valueForKey:의 기본 구현에 대한 전체 검색 경로는 "Accessor Search Implementation Details" 설명하지만, 여기에 "짧은"버전입니다 :

  • get<Key>, <key>는, is<Key>은 (예, 처음부터이 보이는

      getKey입니다 참조로 값을 반환하지 않으면 getter 앞에 get이라는 접두어를 붙이면 안되기 때문에 다소 당황 스럽습니다.하지만 여기서는 먼저 확인해야합니다.)

    • countOf<Key>, objectIn<Key>AtIndex:<key>AtIndexes. 이들의 합법적 인 조합이 발견되면 NSArray와 같은 프록시 객체가 반환됩니다.

    • countOf<Key>, enumeratorOf<Key>memberOf<Key>:. 3 개가 모두 발견되면 NSSet과 유사한 프록시 객체가 반환됩니다. accessInstanceVariablesDirectlyYES (기본값) 인 경우

    • , 다음 인스턴스 변수는 체크 _<key>, _is<Key>, <key>, 또는 is<Key> 이름. 네, 이것은 사적인 이바라기에 접근하는 방법입니다.

    • 다른 모든 것이 실패한 경우 valueForUndefinedKey:이 호출되어 결과를 반환 할 수 있습니다 (실제로는 일반적인 키/값 저장소를 원할 경우 매우 유용합니다).

    그러나 10 번 중 9 번, <key>이라는 값의 값을 얻게됩니다.

    사이드 노트 : valueForKey:은 개체를 반환합니다. 반환 값이 숫자 형 스칼라 (BOOL 포함)이면 NSNumber을 반환합니다. 그렇지 않으면 NSValue을 반환합니다.NSPoint, NSRange, NSRectNSSize (Mac의 경우 iOS의 경우에만 NSRange이 특수하게 처리됩니다)에 대한 특수 처리가 있습니다.

  • +1

    +1 만 문서를 복사하지만 유용한 요약 –

    +0

    obj.property = value는 어떨까요? 그것은 [obj setProperty : value]와 동일합니까? – Boon

    +0

    예. 점 표기법 설정자는 관련 설정 메소드로 변환됩니다. –

    0

    obj.property는 같이 속성 OBJ] 같지 않다 [valueForKey OBJ "속성"@] ;. 후자는 속성과 분리 된 키 값 코딩이라는 시스템의 일부입니다.

    +0

    런타임시 무엇이 해결 되나요? class_getProperty? – Boon

    +2

    모든 메소드 호출과 마찬가지로 objc_msgSend로 해석됩니다. 속성 액세스는 메서드 호출 일뿐입니다. –

    +1

    class_getProperty는 인트로 스페 크션을 수행합니다. 아무것도 호출하는 데 사용되지 않습니다 –

    관련 문제