我有一个自定义的BackBarButton,我有一个属性来存储一个可以在某些情况下改变的选择器。所以我不能非常顺利地使用代表团。
如果不将“工作流程”更改为委派,我该怎么做才能摆脱此警告?该属性使用以下定义:
@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]);
答案 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];