为什么要用我的表演选择器警告



下面是一个简单的 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:将是它的名字。

此警告是由于您尚未告诉编译器选择器所在的位置,将文件导入到它所在的位置或将选择器添加到头文件应有的位置

最新更新