最近学习高人的代码,突然发现了一种delegate很屌的写法(第一次见到,感觉略屌...)请看:
声明
@property (nonatomic, assign) id delegate;
@property(nonatomic, assign) SEL Click;
实现
if (_delegate && _Click) {
[_delegate performSelector:_Click withObject:btn.titleLabel.text];
}
遵守协议实现协议方法
secondViewController *vc = [[secondViewController alloc] init];
vc.delegate = self;
vc.Click = @selector(onclick:);
协议方法
- (void)onclick:(NSString *)str {
NSLog(@"%@",str);
}
是不是和以前不同呢?是不是屌屌的样子?
代码写完后你会发现
黄色的警告!!! 身为程序狗,怎么能看到这样的事情发生呢?
于是开始找资料,终于在stackoverflow找到了一个解决方案,地址:http://stackoverflow.com/questions/7017281/performselector-may-cause-a-leak-because-its-selector-is-unknown。
在ARC项目中使用 performSelector: withObject: 函数出现“performSelector may cause a leak because its selector is unknown”。主要是警告信息,在非ARC项目中没有这个警告。
我才不管什么arc什么mrc呢 我要的是如何去掉黄色的家伙!
如果是在某一处修改只需要加入下列代码
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[_delegate performSelector:_Click withObject:btn.titleLabel.text];
#pragma clang diagnostic pop
如果多出出现次警告,可以定义一个宏:
#define SuppressPerformSelectorLeakWarning(Stuff) \
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
Stuff; \
_Pragma("clang diagnostic pop") \
} while (0)
使用方法如下:
- 如果没有返回结果,可以直接按如下方式调用:
SuppressPerformSelectorLeakWarning(
[_delegate performSelector:_Click withObject:btn.titleLabel.text];
);
- 如果要返回结果,可以按如下方式调用:
id result;
SuppressPerformSelectorLeakWarning(
result =[_delegate performSelector:_Click withObject:btn.titleLabel.text];
);