Objective c 为什么要用我的performSelector发出警告

Objective c 为什么要用我的performSelector发出警告,objective-c,memory-management,automatic-ref-counting,performselector,Objective C,Memory Management,Automatic Ref Counting,Performselector,下面是一个简单的PerformSelector,它向obj发送消息以执行循环方法。所有工作正常,但我得到以下黄色警告 PerformSelect可能会导致泄漏,因为其选择器未知 更新——真正的答案 这是特定于ARC的: 简而言之,ARC使用基于命名约定和绑定到选择器的任何附加属性的信息。当通过名称访问选择器并通过performSelector:方法系列执行选择器时,该信息将丢失,编译器警告您必须对引用计数进行一些假设,因为这些信息已被删除 简而言之,您发布的特定程序是安全的,但我们鼓励您使用A

下面是一个简单的PerformSelector,它向obj发送消息以执行循环方法。所有工作正常,但我得到以下黄色警告

PerformSelect可能会导致泄漏,因为其选择器未知

更新——真正的答案

这是特定于ARC的:

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

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

先前的响应

选择器的声明不需要对当前翻译可见就可以调用它

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

有几个编译器警告可以警告您这些可疑操作


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

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

选择器是MyClass中的类方法。我已将#import“MyClass.h”放在main的顶部-您是否已在您的MyClass.h中声明?编译器只知道预先声明到某行的内容或通过某些库包含的内容是,该方法已在头文件中声明-我刚刚进行了编辑以显示所有文件确定如果([obj respondsToselecto:mySel]),请执行此操作{[obj performSelector:mySel];}谢谢你的帮助,但作为一个新手,我仍然有点困惑。如果可能的话,你能解释一下或者更好地发送一个例子,说明你不声明当前翻译的意思。循环方法在接口中,不需要冒号,因为它不接受任何参数(它只是注销一个字符串)@pete谢谢你扩展你的帖子。我已经用一个真实的答案更新了它。这就解释了它。是的,我已经打开了ARC。谢谢
#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;
}
#import <Foundation/Foundation.h>

@interface MyClass : NSObject

-(void)looping;

@end
#import "MyClass.h"

@implementation MyClass

-(void)looping{

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

}

@end