iOS 代理对象NSProxy

本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见谅与指出,另文章内容如有不妥之处还望指教,万分感谢。

特殊的NSProxy

  • NSProxy是苹果官方推荐专门用来做消息转发的,内部有一个target属性,定位更加精准,效率非常高;
  • NSProxy和NSObject是同一个级别的类,都是基类;
@interface NSProxy  {
    Class   isa;
}
@interface NSObject  {
    Class isa  OBJC_ISA_AVAILABILITY;
}

特殊:

  • NSProxy对象不需要调用init初始化,因为它本来就没有init方法

  • 查找方法时先判断当前继承自NSProxy的类自己有没有该方法,如果没有就跳过消息发送和动态解析,直接来到消息转发阶段;

  1. (NSMethodSignature *)methodSignatureForSelector:(SEL)sel方法必须实现
  2. (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];
}

你可能感兴趣的:(iOS 代理对象NSProxy)