PerformSelector可能导致泄漏 - 更好的解决方案

时间:2015-02-02 10:39:25

标签: ios objective-c xcode warnings

我有一个自定义的BackBarButton,我有一个属性来存储一个可以在某些情况下改变的选择器。所以我不能非常顺利地使用代表团。

Warning description

如果不将“工作流程”更改为委派,我该怎么做才能摆脱此警告?该属性使用以下定义:

@property (nonatomic, strong) id<SPUniversalBackBarButtonItemDelegate> delegate;
@property (nonatomic, assign) SEL delegationSelector;

我也试过使用这段代码,但它说“没有已知的选择器实例方法......”和“对IMP的Objective-C指针的隐式对话”......

IMP imp = [[self delegate] methodForSelector:[self delegationSelector]];
void (*func)(id, SEL) = (void *)imp;
func([self delegate], [self delegationSelector]);

2 个答案:

答案 0 :(得分:6)

您可以在协议声明中公开您的方法。然后你就可以在不需要选择器的情况下调用它。而你却没有发出警告。

OR

如果您只是想摆脱警告:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
        //code here will ignore the warning
#pragma clang diagnostic pop

答案 1 :(得分:4)

首先为什么你的代表强大?我真的怀疑你想要一个强大的代表。大多数情况下,您需要一个弱代表,因为您不希望您的对象决定代表的内存状态。

执行选择器的替代方法是NSInvocation

NSMethodSignature * mySignature = [self.delegate methodSignatureForSelector:self.delegationSelector];
NSInvocation * myInvocation = [NSInvocation
invocationWithMethodSignature:mySignature];
myInvocation.target = self.delegate;
myInvocation.selector = self.delegationSelector;
[myInvocation invoke];