出现PerformSelector may cause a leak because its selector is unknown的问题

本文探讨了ARC环境下使用performSelector可能导致的内存泄漏问题及其原因,并提供了两种解决方案:一是利用函数指针来规避;二是通过宏定义来抑制警告,确保代码的正确性和整洁性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原因

因为在ARC的情况下,运行时需要知道你的返回值,可能是id,NSString等,但是直接performSelector系统不知道返回值的,不知道该如何处理

[self.target1 performSelector:NSSelectorFromString(@"self.action1") withObject:self];
[self.target1 performSelector:self.action1 withObject:self];

解决方法

1 用函数指针的方法

SEL selector = NSSelectorFromString(@"someMethod");
IMP imp = [_controller methodForSelector:selector];
void (*func)(id, SEL) = (void *)imp;
func(_controller, selector);
当有额外的参数

SEL selector = NSSelectorFromString(@"processRegion:ofView:");
IMP imp = [_controller methodForSelector:selector];
CGRect (*func)(id, SEL, CGRect, UIView *) = (void *)imp;
CGRect result = func(_controller, selector, someRect, someView);
2 使用通用的消除警告的方法

使用宏定义,方便调用

#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:_action withObject:self]
);
有返回值

id result;
SuppressPerformSelectorLeakWarning(
    result = [_target performSelector:_action withObject:self]
);

参考博客
http://blog.youkuaiyun.com/majiakun1/article/details/46424925














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值