1

下面是一个简单的 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 因为循环方法确实被调用 - 有什么想法吗?


更新

我的类.h

#import <Foundation/Foundation.h>

@interface MyClass : NSObject

-(void)looping;

@end

我的班级.m

#import "MyClass.h"

@implementation MyClass

-(void)looping{

    NSLog(@"Hey, i'm looping");

}

@end
4

2 回答 2

2

更新——真正的答案

这是 ARC 特有的:

performSelector 可能会导致泄漏,因为它的选择器是未知的

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

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

以前的回应

选择器的声明不需要对当前翻译可见才能调用它。

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

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

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

于 2012-05-10T09:32:01.647 回答
0

这个警告是因为你没有告诉编译器选择器所在的位置,将文件导入到它所在的位置或将选择器添加到头文件应该在的位置

于 2012-05-10T09:33:57.203 回答