下面是一个简单的 PerformSelector,它向 obj 发送消息以执行循环方法。一切正常,但我收到以下黄色警告。
执行选择器可能会导致泄漏,因为它的选择器是未知的。
#import "MyClass.h"
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
MyClass *obj = [[MyClass alloc]init];
SEL mySel = @selector(looping);
[obj performSelector:mySel];
}
return 0;
}
此警告没有意义,因为 performSelector 必须知道 mySel,因为循环方法确实被调用 - 任何想法发生了什么?
更新
MyClass.h
#import <Foundation/Foundation.h>
@interface MyClass : NSObject
-(void)looping;
@end
我的班级
#import "MyClass.h"
@implementation MyClass
-(void)looping{
NSLog(@"Hey, i'm looping");
}
@end
更新 -- 真正的答案
这是特定于 ARC 的:
执行选择器可能会导致泄漏,因为它的选择器未知
简而言之,ARC 使用基于命名约定和绑定到选择器的任何其他属性的信息。当按名称访问选择器并通过performSelector:
系列方法执行它时,该信息将丢失,并且编译器警告您它必须对引用计数做出一些假设,因为此信息已被剥离。
简而言之,您发布的特定程序是安全的,但鼓励您使用 ARC 友好的替代方案。
上一个响应
选择器的声明不需要对当前翻译可见即可调用它。
允许编译器采用参数的默认类型,并返回类和实例方法的返回类型(id
是默认值(。
有几个编译器警告可以警告您这些可疑操作。
您可能忘记在@interface
中声明选择器looping
,或者您可能省略了冒号(如果它有参数(:looping:
将是它的名字。
此警告是由于您尚未告诉编译器选择器所在的位置,将文件导入到它所在的位置或将选择器添加到头文件应有的位置