PerformSelector 可能导致泄漏 - 更好的解决方案
PerformSelector may cause a leak - Better solution
我有一个自定义的 BackBarButton,我有一个 属性 来存储在某些情况下可以更改的选择器。所以我真的不能很顺利的使用委托
如何在不将 'workflow' 更改为委派的情况下消除此警告? 属性 是这样定义的:
@property (nonatomic, strong) id<SPUniversalBackBarButtonItemDelegate> delegate;
@property (nonatomic, assign) SEL delegationSelector;
我也尝试使用此代码,但它显示 'No known instance method for selector...' 和 'Implicit conversation of an Objective-C pointer to IMP'...
IMP imp = [[self delegate] methodForSelector:[self delegationSelector]];
void (*func)(id, SEL) = (void *)imp;
func([self delegate], [self delegationSelector]);
您可以在协议声明中公开您的方法。然后你就可以在不需要选择器的情况下调用它。而且你不会有那个警告。
或
如果您只是想摆脱警告:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
//code here will ignore the warning
#pragma clang diagnostic pop
首先为什么你的代表很强?我真的怀疑你想要一个强有力的代表。大多数时候你想要一个弱委托是因为你不希望你的对象决定你的委托的内存状态。
执行选择器的替代方法是 NSInvocation:
NSMethodSignature * mySignature = [self.delegate methodSignatureForSelector:self.delegationSelector];
NSInvocation * myInvocation = [NSInvocation
invocationWithMethodSignature:mySignature];
myInvocation.target = self.delegate;
myInvocation.selector = self.delegationSelector;
[myInvocation invoke];
我有一个自定义的 BackBarButton,我有一个 属性 来存储在某些情况下可以更改的选择器。所以我真的不能很顺利的使用委托
如何在不将 'workflow' 更改为委派的情况下消除此警告? 属性 是这样定义的:
@property (nonatomic, strong) id<SPUniversalBackBarButtonItemDelegate> delegate;
@property (nonatomic, assign) SEL delegationSelector;
我也尝试使用此代码,但它显示 'No known instance method for selector...' 和 'Implicit conversation of an Objective-C pointer to IMP'...
IMP imp = [[self delegate] methodForSelector:[self delegationSelector]];
void (*func)(id, SEL) = (void *)imp;
func([self delegate], [self delegationSelector]);
您可以在协议声明中公开您的方法。然后你就可以在不需要选择器的情况下调用它。而且你不会有那个警告。
或
如果您只是想摆脱警告:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
//code here will ignore the warning
#pragma clang diagnostic pop
首先为什么你的代表很强?我真的怀疑你想要一个强有力的代表。大多数时候你想要一个弱委托是因为你不希望你的对象决定你的委托的内存状态。
执行选择器的替代方法是 NSInvocation:
NSMethodSignature * mySignature = [self.delegate methodSignatureForSelector:self.delegationSelector];
NSInvocation * myInvocation = [NSInvocation
invocationWithMethodSignature:mySignature];
myInvocation.target = self.delegate;
myInvocation.selector = self.delegationSelector;
[myInvocation invoke];