美文网首页
iOS-代理实现机制?

iOS-代理实现机制?

作者: hyeeyh | 来源:发表于2016-09-22 14:49 被阅读239次

    今天看到一篇博客介绍OC消息转发机制,看着看着我突然想到了代理,于是自己就动手写了个DEMO来测试下。

    首先我们新建一个工程,然后创建一个测试类,这里我用的一个View视图,如图


    E542379E-D5A8-432C-81E9-381C7AA3C2AD.png

    testView的头文件结构:

    #import <UIKit/UIKit.h>
    
    @interface testView : UIView
    
    - (instancetype)initWithDelegate:(id)delegate;
    
    @property(nonatomic,weak) id delegate;
    
    -(void)getTheCurrentViewName:(NSString *)string;
    
    @end
    
    

    再然后是textView的实现

    #import "testView.h"
    
    @implementation testView
    
    - (instancetype)initWithDelegate:(id)delegate
    {
        self = [super init];
        if (self) {
            _delegate=delegate;
           //调用已声明方法 本类中不实现 留给代理对象去实现
            [self getTheCurrentViewName:NSStringFromClass([self class])];
        }
        return self;
    }
    //消息的转发会触发的方法
    -(id)forwardingTargetForSelector:(SEL)aSelector{
    //该方法返回能处理未实现方法的对象
        if ([_delegate respondsToSelector:aSelector]) {
         
            return _delegate;
            
        }
        return nil;
    }
    @end
    
    

    再然后是在控制器的实现

    #import "ViewController.h"
    #import "testView.h"
    
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        //初始化下testView
        testView *testview = [[testView alloc]initWithDelegate:self];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
    }
    //实现testView中未实现的方法
    -(void)getTheCurrentViewName:(NSString *)string{
    
        NSLog(@"这就是我想要的效果:%@",string);
    
    }
    @end
    

    运行 控制台的输出如下图:

    AA7A8067-0807-45DA-8BE6-C6F7395581D5.png

    好了,这就是我这次要分享的内容,太久没写文章,组织能力有限,希望各路大神不要吐槽。。。
    这只是我个人对代理的一些理解,不知道苹果的代理底层是怎么实现,不过以上方法我觉得和代理差不多,应该能实现代理的相应功能。

    相关文章

      网友评论

          本文标题:iOS-代理实现机制?

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