-forwardInvocation:
是消息转发机制的一部分。不必担心消息转发,因为它只被代理对象使用,在通常情况下你永远不需要使用它或知道你正在使用它。
-performSelector:
假设消息的返回类型是id
或兼容类型,因此如果用它来发送返回类型不同的消息(例如32位系统上比指针更宽的long long
,或通过不同的寄存器/地址返回的float
或大型struct
),就不安全了。
如果想间接发送这样的消息,可以创建NSInvocation
类的实例,然后发送-invoke
。返回值将存储在调用对象中,并可以通过它访问。在这种情况下,你永远不会使用-forwardInvocation:
。
一般来说,如果你发现自己使用-performSelector:
,那么你可能正在处理反模式。在这种情况下,你正在尝试发送一个ClassA
不知道的消息。另一种解决方案是公开这些私有方法。
如果你拥有ClassA
和ClassB
,可以为ClassB
创建一个“私有”头文件,其中包含你想要使用的私有方法。如果其他人(例如苹果)拥有ClassB
,那么你正在处理未记录的API,并且可能需要寻找另一种方法,因为苹果将拒绝使用这些API的应用程序。
要创建私有头文件,请进入Xcode并创建一个新的头文件。将其命名为“ClassB+Internal.h”或“ClassB+PrivateMethodsForMeOnly.h”之类的名称。将其视为私有于你的项目-除了与ClassB
同级别(同一子项目、库或组件)的人不得使用它。在这个新头文件中,添加以下内容:
#import "ClassB.h"
@interface ClassB (PrivateMethodsForMeOnly)
- (double)someMethod;
- (const struct low_level_c_type_t)otherMethod:(int)i;
@end
在
ClassA.m
中(不是
ClassA.h
,除非你想让每个使用
ClassA
的人都看到这些方法!)在你的include部分添加以下行:
ClassA
将随后可以访问该新类别中的这些方法。