performSelector引起的警告解决办法

             在写项目的时候,两个动作,同样的操作,但是传递不同的消息,就想到了[target performSelector:sell withObject:nil],写完后发现很正常,但是有个警告,本能的就觉得不舒服,仔细一看:performSelector may cause a leak because itsselector is unknown。

           既然编译报警告,我们就不能不管。引起这个警告的原因是什么呢?

   我们在调用这些方法的时候有可能返回的是void 或者其他 non-Objects,我们可以忽略这个警告,但是不建议这么做。我们知道oc的内存管理机制,有retain必然有release。在arc模式下,这些都由编译器帮我们做了。但是,假如我们的方法返回的是non-Objects(当然,包括void),这时retain或者release,我们的程序就有可能crash掉。

既然知道了原因,那么解决办法呢?

我们有两种解决办法

第一种:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    [target performSelector: sel withObject: nil];
#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(
    [target performSelector:sel withObject:nil]
);

 这样使用起来更方便,但是这种方法并没有真正消除这个警告 

第二种解决办法:

SEL selector = NSSelectorFromString(@"someMethod");
IMP imp = [_controller methodForSelector:selector];
void (*func)(id, SEL) = (void *)imp;
func(_controller, selector);
还有另一种写法,不过读起来费力

SEL selector = NSSelectorFromString(@"someMethod");
((void (*)(id, SEL))[target methodForSelector:selector])(target, selector);

到此,这个警告算是完全消除了。

更加详细请移步:http://stackoverflow.com/questions/7017281/performselector-may-cause-a-leak-because-its-selector-is-unknown




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值