NSProxy

作者: anna_hui | 来源:发表于2018-01-21 13:35 被阅读0次

它来实现一下"伪多继承".

直接上个代码来展示下


#import <Foundation/Foundation.h>

@interface JanProxy : NSProxy

- (void)transformObjc:(NSObject *)objc;

@end

JanProxy.m

#import "JanProxy.h"

@interface JanProxy ()

@property(nonatomic,strong)NSObject *objc;

@end
@implementation JanProxy



- (void)transformObjc:(NSObject *)objc
{
    //复制对象
    self.objc = objc;
}

//2.有了方法签名之后就会调用方法实现
- (void)forwardInvocation:(NSInvocation *)invocation
{
    if (self.objc) {
        //拦截方法的执行者为复制的对象
        [invocation setTarget:self.objc];
           
        if ([self.objc isKindOfClass:[NSClassFromString(@"Teacher") class]]) {
            //拦截参数 Argument:表示的是方法的参数  index:表示的是方法参数的下标
            NSString *str = @"拦截消息";
            [invocation setArgument:&str atIndex:2];
        }
        
        //开始调用方法
        [invocation invoke];
    }
    
}

//1.查询该方法的方法签名
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel
{
    NSMethodSignature *signature = nil;
    if ([self.objc methodSignatureForSelector:sel]) {
        signature = [self.objc methodSignatureForSelector:sel];
    }
    else
    {
        signature = [super methodSignatureForSelector:sel];
    }
    
    return signature;
}

@end

使用方法

Dog *dog = [[Dog alloc]init];
    
    //OC中方法的调用本质上是给这个对象发送一个消息
    Cat *cat = [[Cat alloc] init];
 
    //开始复制拦截方法
    JanProxy *proxy = [JanProxy alloc];
    //开始变身成猫
    [proxy transformObjc:cat];
    //开始调猫的方法
    [proxy performSelector:@selector(eat:) withObject:@"猫发出消息"];
    
    //开始变身成狗
    [proxy transformObjc:Dog];
    //开始调用学生的方法
    [proxy performSelector:@selector(shut)];
最后的结果 image

控制台输出结果 发现没有,猫发出消息已经被子类的内部拦截并且做出了修改.

总结

OC中存在这么一个默默无闻的类NSProxy,填补了"多继承"这个空白区.

相关文章

  • 重拾iOS-NSProxy

    关键词:NSProxy,NSObject,Runtime 面试题:1)知道NSProxy吗?2)NSProxy和N...

  • NSProxy

    NSProxy.h文件内容 NSProxy 是一个抽象类NSProxy遵守了 NSObject 协议,内部有它的 ...

  • NSProxy、NSInvocation、NSMethodSig

    什么是NSProxy: NSProxy是一个抽象的基类,是根类,与NSObject类似 NSProxy和NSObj...

  • [iOS] 七七八八的小姿势(2)

    目录: NSProxy 字典集合对成员的引用方式 class判断 block变量捕获 1. NSProxy NSP...

  • NSProxy 和 NSObject 关系

    一、NSProxy 简介NSProxy 是一个抽象类,它实现了protocol NSObject 所要求的基本方法...

  • 老生常谈之NSProxy和NSTimer

    网上NSProxy和NSTimer都写烂了,所以这里只做下总结: 1.NSProxy应用场景: 解决NSTimer...

  • NSProxy

    NSProxy——少见却神奇的类 - IOS - 伯乐在线

  • NSProxy

    吾尝以为NSObject是Apple的所有Objective-C引用类型的老祖宗,直到后来知道了NSProxy的存...

  • NSProxy

    作用一: 代理想要拦截自定义CPTabBarController(UITabBarController子类)中ta...

  • NSProxy

    它来实现一下"伪多继承". 直接上个代码来展示下 使用方法 控制台输出结果 发现没有,猫发出消息已经被子类的内部拦...

网友评论

      本文标题:NSProxy

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