No.-forwardInvocation:
用作消息转发机制的一部分。不要担心消息转发,因为它实际上只被代理对象使用,而且很有可能你永远不需要使用它并且知道你正在使用它。
-performSelector:
假定消息的返回类型是id
或兼容的,因此如果它用于发送返回类型不同的消息(例如比long long
32 位系统上的指针更宽,或通过不同的寄存器/地址返回),则不安全例如 afloat
或 large struct
。)
如果你想间接发送这样的消息,你可以创建一个类的实例NSInvocation
然后发送它-invoke
。然后将返回值存储在调用对象中,并可以通过它进行访问。-forwardInvocation:
在这种情况下,您永远不会使用。
一般来说,如果您发现自己在使用-performSelector:
,您可能正在处理反模式。在这种情况下,您正在尝试发送一条ClassA
不正式知道的消息。另一种解决方案是公开这些私有方法。
如果您同时拥有ClassA
and 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
此后将可以访问新类别中的这些方法。