为什么用performSelector警告

时间:2012-05-10 09:27:49

标签: objective-c memory-management automatic-ref-counting performselector

下面是一个简单的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

2 个答案:

答案 0 :(得分:2)

更新 - 真实答案

这是ARC特定的:

performSelector may cause a leak because its selector is unknown

简而言之,ARC使用基于命名约定的信息以及绑定到选择器的任何其他属性。当按名称访问选择器并通过performSelector:系列方法执行它时,该信息将丢失,编译器会警告您必须对引用计数做出一些假设,因为这些信息已被删除。

简而言之,您发布的特定程序是安全的我们鼓励您使用对ARC友好的替代方案。

以前的回复

当前翻译无需显示选择器声明即可调用它。

允许编译器假设参数的默认类型和类和实例方法的返回类型(id是默认值)。

有几个编译器警告可以警告您这些阴暗的操作。

您可能忘记在looping中声明选择器@interface,或者您可能省略了冒号,如果它有参数:looping:就是它的名字。

答案 1 :(得分:0)

这个警告是由于你没有告诉编译器选择器所在的位置,将文件导入到原来的位置或将选择器添加到头文件所在的位置