本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见谅与指出,另文章内容如有不妥之处还望指教,万分感谢。
特殊的NSProxy
- NSProxy是苹果官方推荐专门用来做消息转发的,内部有一个target属性,定位更加精准,效率非常高;
- NSProxy和NSObject是同一个级别的类,都是基类;
@interface NSProxy <NSObject> {
Class isa;
}
@interface NSObject <NSObject> {
Class isa OBJC_ISA_AVAILABILITY;
}
特殊:
-
NSProxy对象不需要调用init初始化,因为它本来就没有init方法
-
查找方法时先判断当前继承自NSProxy的类自己有没有该方法,如果没有就跳过消息发送和动态解析,直接来到消息转发阶段;
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel方法必须实现
- (void)forwardInvocation:(NSInvocation *)invocation必须实现
应用:
- 两个对象循环引用,为了不让彼此强引用就使用NSProxy来作为其中一个中间对象:target;
+ (instancetype)proxyWithTarget:(id)target
{
XYHProxy *proxy = [XYHProxy alloc];
proxy.target = target;
return proxy;
}
//消息转发到target
//返回方法签名
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel
{
return [self.target methodSignatureForSelector:sel];
}
//内部实现方法调用
- (void)forwardInvocation:(NSInvocation *)invocation
{
[invocation invokeWithTarget:self.target];
}
网友评论