tob*_*pwn 3 objective-c ios ios5 ios5.1
对于objective-c来说很新,但是我遇到了一个很常见的情况:我希望ClassA要求ClassB对只有ClassB知道的对象执行一个方法(并且还使用ClassA未知的方法) ).
我已经找到了两种方法:performSelector:和forwardInvocation: - 但是我想学习更多并巩固我对每个方面的理解.我在apple开发者文档中找到了这个注释:
aSelector参数[在performSelector:]中应该标识不带参数的方法.对于返回除对象以外的任何内容的方法,请使用NSInvocation.
..这意味着以- (id)methodName开头的方法将使用performSelector : ,而说- (int)nonObjectMethodName将使用forwardInvocation : ?
还有什么方法返回(void)?或者返回非id对象的方法,例如(NSString)?
号码-forwardInvocation:用作消息转发机制的一部分.不要担心消息转发,因为它实际上只用于代理对象,而且几率很高,你永远不需要使用它并知道你正在使用它.
-performSelector:假设消息的返回类型是id或兼容的,因此如果它用于发送返回类型不同的消息(例如,比long long32位系统上的指针更宽,或通过不同的寄存器/地址返回)则不安全比如一个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
Run Code Online (Sandbox Code Playgroud)
而在ClassA.m(不 ClassA.h,除非你想公开这些方法大家谁使用ClassA!)添加下面一行在包括部分:
#import "ClassB+PrivateMethodsForMeOnly.h"
Run Code Online (Sandbox Code Playgroud)
ClassA 之后将可以访问新类别中的那些方法.
| 归档时间: |
|
| 查看次数: |
1949 次 |
| 最近记录: |