PerformSelector可能会导致泄漏 – 更好的解决scheme

我有一个自定义的BackBarButton,我有一个属性来存储select器,可以在某些情况下更改。 所以我不能顺利使用委派。

警告说明

我可以做些什么来摆脱这个警告,而不改变“工作stream程”授权? 该属性是用这个定义的:

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

我也尝试使用这个代码,但是它表示“没有已知的select器的实例方法…”和“IMP的Objective-C指针的隐式对话”…

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

您可以在协议声明中公开您的方法。 那么你将能够调用它,而不需要select器。 你不会有这个警告。

要么

如果你只是想摆脱这个警告:

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

首先,为什么你的代表强? 我真的怀疑你想要一个强大的代表。 大多数时候你想要一个弱委托,因为你不想让你的对象指定你的委托的内存状态。

执行select器的替代方法是NSInvocation :

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