zoukankan      html  css  js  c++  java
  • NSProxy的学习使用

    NSProxy

    一个抽象的超类,并且是不继承自NSObject的。可以通过它的API为其它的Object对象或者不存在的对象提供替身。

    大概意思就是:我们知道狗不能飞,但是如果你通过NSProxy强行调用[狗 飞]的时候,可以通过NSProxy的提供的API,让狗飞的这个操作交给鸟来执行,前提是NSProxy持有了鸟的Target。

    举个猫吃狗叫的例子,参考的是apple的文档

    #import <Foundation/Foundation.h>
    
    @interface ProxyManager : NSProxy
    
    + (id)proxyForObject1:(id)obj1 object2:(id)obj2;
    
    @end
    
    #import "ProxyManager.h"
    
    @interface ProxyManager()
    
    @property (nonatomic, weak) id target1;
    @property (nonatomic, weak) id target2;
    @end
    
    @implementation ProxyManager
    
    - (instancetype)initWithTarget1:(id)obj1 target2:(id)obj2 {
        _target1 = obj1;
        _target2 = obj2;
        
        return self;
    }
    
    + (id)proxyForObject1:(id)obj1 object2:(id)obj2 {
        
        return [[ProxyManager alloc] initWithTarget1:obj1 target2:obj2];
    }
    
    //重写NSProxy如下两个方法,在处理消息转发时,将消息转发给真正的Target处理
    - (void)forwardInvocation:(NSInvocation *)invocation {
        id target;
        if ([_target1 methodSignatureForSelector:invocation.selector]) {
            target = _target1;
        }else{
            target = _target2;
        }
        [invocation invokeWithTarget:target];
        
    }
    
    - (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
        
        NSMethodSignature *sig;
        
        sig = [_target1 methodSignatureForSelector:selector];
        if (sig) {
            return sig;
        }
        
        sig = [_target2 methodSignatureForSelector:selector];
        return sig;
    }
    
    
    @end
    

    测试代码:

    Dog *dog = [Dog new];
    Cat *cat = [Cat new];
    
    id proxy = [ProxyManager proxyForObject1:dog object2:cat];
    [proxy speak];
    [proxy eat];
    [proxy speak];
    

    执行结果:

    speak dog
    eat Cat
    speak dog
    
    NSProxy的经常使用的地方,就是解决NSTimer、CADisplayLink等循环引用的内存问题。前篇学习YYFPSLabel时候已经有所涉及。
  • 相关阅读:
    洛谷P3258 [JLOI2014]松鼠的新家
    洛谷P3128 [USACO15DEC]最大流Max Flow
    Bzoj1651: [Usaco2006 Feb]Stall Reservations 专用牛棚
    2017-9-26 NOIP模拟赛
    洛谷P1441 砝码称重
    洛谷P1275 魔板
    洛谷P2037 电话号码
    2014-11-3 NOIP模拟赛2
    洛谷P3102 [USACO14FEB]秘密代码Secret Code
    洛谷P3070 [USACO13JAN]岛游记Island Travels
  • 原文地址:https://www.cnblogs.com/vokie/p/9289958.html
Copyright © 2011-2022 走看看