下面是一个简单的PerformSelector,它向obj发送一条消息来执行循环方法。一切运作良好,但我得到以下黄色警告。
PerformSelector可能会导致泄漏,因为它的选择器未知。
#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
MyClass.m
#import "MyClass.h"
@implementation MyClass
-(void)looping{
NSLog(@"Hey, i'm looping");
}
@end
答案 0 :(得分:2)
更新 - 真实答案
这是ARC特定的:
performSelector may cause a leak because its selector is unknown
简而言之,ARC使用基于命名约定的信息以及绑定到选择器的任何其他属性。当按名称访问选择器并通过performSelector:
系列方法执行它时,该信息将丢失,编译器会警告您必须对引用计数做出一些假设,因为这些信息已被删除。
简而言之,您发布的特定程序是安全的但我们鼓励您使用对ARC友好的替代方案。
以前的回复
当前翻译无需显示选择器声明即可调用它。
允许编译器假设参数的默认类型和类和实例方法的返回类型(id
是默认值)。
有几个编译器警告可以警告您这些阴暗的操作。
您可能忘记在looping
中声明选择器@interface
,或者您可能省略了冒号,如果它有参数:looping:
就是它的名字。
答案 1 :(得分:0)
这个警告是由于你没有告诉编译器选择器所在的位置,将文件导入到原来的位置或将选择器添加到头文件所在的位置