今天看到一篇博客介绍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好了,这就是我这次要分享的内容,太久没写文章,组织能力有限,希望各路大神不要吐槽。。。
这只是我个人对代理的一些理解,不知道苹果的代理底层是怎么实现,不过以上方法我觉得和代理差不多,应该能实现代理的相应功能。
网友评论