iOS-代理实现机制?

2016-09-22  本文已影响239人  hyeeyh

今天看到一篇博客介绍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

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

上一篇下一篇

猜你喜欢

热点阅读