美文网首页
Selector---warning:performSelect

Selector---warning:performSelect

作者: afyylong | 来源:发表于2016-11-12 16:37 被阅读86次

最近学习高人的代码,突然发现了一种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);
}

是不是和以前不同呢?是不是屌屌的样子?
代码写完后你会发现


⚠️ 2016-11-12 下午4.18.49.png

黄色的警告!!! 身为程序狗,怎么能看到这样的事情发生呢?
于是开始找资料,终于在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];
);

相关文章

网友评论

      本文标题:Selector---warning:performSelect

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