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:
。
我有以下代码:
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:
。