2012-12-15 6 views
11

그게 전부입니다. 왜 누군가는 (적어도 공개 API로서) 그런 방법을 원했을까요? 거기에 실용적인 용도가 있습니까?NSObject 준수 클래스에서 -self 메서드의 용도는 무엇입니까?

+0

글쎄, 왜 ...? –

+1

질문은 "왜 누구가 원하는가 ..."또는 "목적은 무엇입니까 ..."가 아니라 "왜 그곳에 있습니까?"였습니다. – Matoe

+1

이것은 유효한 질문 인 것 같습니다. 왜 downvotes? –

답변

12

self 방법은 키 - 값 코딩 (KVC)에 유용합니다.

KVC를 사용하면 사전과 비슷한 개체를 처리 할 수 ​​있습니다. [view valueForKey:@"superview"]과 같이 속성 이름이 포함 된 문자열을 사용하여 객체의 속성에 액세스 할 수 있습니다. 키 경로가 포함 된 문자열 (예 : [view valueForKeyPath:@"superview.superview.center"])을 사용하여 속성 체인을 연결합니다.

NSObject에는 self 방법이 있으므로 self을 키 또는 키 경로로 사용할 수 있습니다 ([view valueForKey:@"self"]). 따라서 프로그래밍 방식으로 키 경로를 구성하거나 파일에서 키 경로를 읽는 경우 "self"을 키로 사용하면 특별한 경우 작성을 피할 수 있습니다.

당신은 또한이 같은 조건에서 self를 사용할 수 있습니다

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self beginswith \"foo\""]; 
NSArray *filteredArray = [arrayOfStrings filteredArrayWithPredicate:predicate]; 

내가 NSPredicate 실제로이 경우에 (아마도 KVC 통해) self 방법을 사용하는지 여부를 알 수 없습니다. 확실히 가능합니다.

+1

"SELF"는 "nil", "NULL"및 기타 묶음과 같은 NSPredicates의 특수 상수로 문서화됩니다. 그것은 실제 "self"메쏘드에 매핑 될 수 있습니다. 그러나 저에게 문서화는 그것이 특별 함을 암시합니다. –

-1

ObjC 런타임과 관련이 있다고 생각합니다.

objc_msgSend(autoreleasePool, sel_registerName("drain")); 
BOOL AppDel_didFinishLaunching(struct AppDel *self, SEL _cmd, void *application, void *options) 

첫 번째 인수는 자체입니다. 나는 그것이 그것과 관련이 있다고 생각한다. 모든 정직하지만 결국은 다음과 같이 끝날 것입니다.

id self(struct id *self, SEL _cmd) { 
    return self; 
} 

....이 응답을 쓰기 시작하기 전에 더 많은 의미가 있습니다.

2

"자체"가 원래 추가 된 이유는 확실하지 않지만 개체에 대한 내부 포인터를 보호하는 데 도움이되는 한 가지 이유가 있습니다. Apple의 공식 권장 사항은 내부 포인터를 사용한 후에 [foo self] 호출을 삽입하는 것입니다. 메소드 호출은 기능적으로 아무 것도하지 않지만 컴파일러가 그 전까지 foo를 유지하도록 보장합니다.

관련 문제