Objective-C 속성은 런타임에 무엇이 해결 되나요? [obj valueForKey : @ "property"]를 호출해도 항상 같은 결과가 나타 납니까?Objective-C 속성은 런타임에 무엇이 해결 되나요?
obj.property
Objective-C 속성은 런타임에 무엇이 해결 되나요? [obj valueForKey : @ "property"]를 호출해도 항상 같은 결과가 나타 납니까?Objective-C 속성은 런타임에 무엇이 해결 되나요?
obj.property
먼저 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과 유사한 프록시 객체가 반환됩니다. accessInstanceVariablesDirectly
가 YES
(기본값) 인 경우
, 다음 인스턴스 변수는 체크 _<key>
, _is<Key>
, <key>
, 또는 is<Key>
이름. 네, 이것은 사적인 이바라기에 접근하는 방법입니다.
다른 모든 것이 실패한 경우 valueForUndefinedKey:
이 호출되어 결과를 반환 할 수 있습니다 (실제로는 일반적인 키/값 저장소를 원할 경우 매우 유용합니다).
그러나 10 번 중 9 번, <key>
이라는 값의 값을 얻게됩니다.
사이드 노트 : valueForKey:
은 개체를 반환합니다. 반환 값이 숫자 형 스칼라 (BOOL
포함)이면 NSNumber
을 반환합니다. 그렇지 않으면 NSValue
을 반환합니다.NSPoint
, NSRange
, NSRect
및 NSSize
(Mac의 경우 iOS의 경우에만 NSRange
이 특수하게 처리됩니다)에 대한 특수 처리가 있습니다.
+1 만 문서를 복사하지만 유용한 요약 –
obj.property = value는 어떨까요? 그것은 [obj setProperty : value]와 동일합니까? – Boon
예. 점 표기법 설정자는 관련 설정 메소드로 변환됩니다. –
obj.property는 같이 속성 OBJ] 같지 않다 [valueForKey OBJ "속성"@] ;. 후자는 속성과 분리 된 키 값 코딩이라는 시스템의 일부입니다.
런타임시 무엇이 해결 되나요? class_getProperty? – Boon
모든 메소드 호출과 마찬가지로 objc_msgSend로 해석됩니다. 속성 액세스는 메서드 호출 일뿐입니다. –
class_getProperty는 인트로 스페 크션을 수행합니다. 아무것도 호출하는 데 사용되지 않습니다 –
애플 문서의 어딘가에서'valueForKey'가 어떻게 다른 플랫폼에서 작동하는지 설명했습니다. –
누군가가 아래쪽 투표에 반대 할 수 있습니까? 이것은 합법적 인 코딩 질문입니다! – Boon