美文网首页
iOS 代理对象NSProxy

iOS 代理对象NSProxy

作者: 水中的蓝天 | 来源:发表于2020-04-14 17:02 被阅读0次

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

    特殊的NSProxy

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

          本文链接:https://www.haomeiwen.com/subject/vvptvhtx.html