번호 -forwardInvocation:
은 메시지 전달 메커니즘의 일부로 사용됩니다. 메시지 전달에 대해서는 걱정하지 마십시오. 실제로 프록시 객체에서만 사용되며 확률은 좋으며 사용하지 않아도되고 사용하는 것을 알 수 있습니다.
-performSelector:
는 메시지의 반환 형식이
id
또는 호환 가정하고 그 반환 타입 등
long long
32 비트 시스템으로 포인터보다 넓은 예 (다른 메시지를 보내는 데 사용되는 경우 매우 안전하지 않다, 또는 이러한
float
또는 대형
struct
.)
간접적 그런 메시지를 보내려면, 당신은 NSInvocation
클래스의 인스턴스를 만든 다음 그것을 -invoke
을 보낼 수있는 다른 레지스터/주소를 통해 돌아왔다. 그런 다음 리턴 값은 호출 오브젝트에 저장되며이를 통해 액세스 할 수 있습니다. 이 시나리오에서는 -forwardInvocation:
을 사용하지 않습니다.
일반적으로 말하면, -performSelector:
을 사용하고 있다면, 아마도 당신은 반 패턴을 다루고있을 것입니다. 이 경우 ClassA
이 공식적으로 알 수없는 메시지를 보내려고합니다. 다른 해결책은 이러한 개인적인 방법을 드러내는 것입니다. 당신이 ClassA
및 ClassB
를 소유하는 경우
, 당신은 당신이 사용하고자하는 개인 방법을 포함 ClassB
위한 "개인"헤더를 만들 수 있습니다. 다른 사람 (예 : Apple)이 ClassB
을 소유하고있는 경우 문서화되지 않은 API를 다루고 있으며 Apple에서 이러한 API를 사용하는 앱을 거부하므로 다른 접근 방법을 찾아야 할 수도 있습니다.
개인 헤더를 만들려면 Xcode로 이동하여 새 헤더 파일을 만드십시오. "ClassB + Internal.h"또는 "ClassB + PrivateMethodsForMeOnly.h"와 같은 이름을 지정하십시오.프로젝트에 비공개로 처리하십시오. ClassB
으로 동료 (동일한 하위 프로젝트 또는 라이브러리 또는 구성 요소)가 아니면 다른 사람이 사용하지 않습니다. 이 새로운 헤더에 다음을 추가
#import "ClassB.h" // so we get the original class definition
@interface ClassB (PrivateMethodsForMeOnly)
- (double)someMethod;
- (const struct low_level_c_type_t)otherMethod:(int)i;
// etc. etc. etc.
@end
그리고 ClassA.m
에서을 (하지ClassA.h
당신은 ClassA
를 사용하는 모든 사람들에게이 방법을 노출하지 않으려면!) 섹션을 포함하여에 다음 줄을 추가합니다 :
#import "ClassB+PrivateMethodsForMeOnly.h"
ClassA
은 새 카테고리의 메소드에 액세스 할 수 있습니다.
주를 읽어야합니다. – NSResponder