performSelector 导致泄漏,因为 objective c 中的输入不正确

performSelector causes leak because not right type in objective c

我有以下代码:

SEL moveAlongBoth = @selector(moveAlongX:andY:);
if ([p1 respondsToSelector:moveAlongBoth]) {
    [p1 performSelector: moveAlongBoth
             withObject: [NSNumber numberWithInt:1]
             withObject: [NSNumber numberWithInt:1]];
}

我收到 "performSelector may cause leak" 警告。 但是

[p1 moveAlongX:1 andY:1];

工作正常。

我知道我收到错误是因为在实现中将值设置为 (int) 并且我使用的是 NSNumber。在不更改实现的情况下,我将如何着手将数字值声明为 int(如果可能)?

关于第二部分。如果您负责可能是 p1 类型的 类,那么您可以用 moveAlongBoth:: 定义 protocol 而不是检查 performSelector检查机智 conformsToProtocol。假设协议的名称是 CanMoveAlong 那么您可以将其转换为

id <CanMoveAlong> canDo = (id<CanMoveAlong>)p1; 

检查一致性并直接调用方法后

[canDo moveAlongX:1 andY:1];

这样做你实现了两者,你摆脱了警告,你可以直接通过 int 而无需使用 NSNumber

为什么你不能这样做:

if ([p1 respondsToSelector:@selector(moveAlongX:andY:)]) {
    [(id)p1 moveAlongX:1 andY:1];
}

顺便说一下,Cocoa naming convention 会让你调用这个方法 moveAlongX:y: