我收到ARC编译器的以下警告: "performSelector may cause a leak because its selector is unknown". 以下是我正在做的事情: [_controller performSelector:NSSelectorFromString(@"someMethod")]; 为什么我会收到此警告?我知道编译器不能检查选择器是否存在,但为什么会导致泄漏?我怎样才能更改我的代码,以便我不再收到此警告? 解 编译器出于某种原因警告这个问题。这种警告很容易被忽略,这很容易解决。就是这样: if (!_controller) { return; } SEL selector = NSSelectorFromString(@"someMethod"); IMP imp = [_controller methodForSelector:selector]; void (*func)(id, SEL) = (void *)imp; func(_controller, selector); 或者更简洁(虽然很难阅读和没有警卫): SEL selector = NSSelectorFromString(@"someMethod"); ((void (*)(id, SEL))[_controller methodForSelector:selector])(_controller, selector); 说明 这里发生的是你要求控制器为控制器对应的方法指定C函数指针。所有NSObject的响应methodForSelector:,但你也可以class_getMethodImplementation在Objective-C运行时使用(如果你只有一个协议引用,这很有用id<SomeProto>)。这些函数指针被称为IMPs,并且是简单的typedefed函数指针(id (*IMP)(id, SEL, ...))1。这可能接近方法的实际方法签名,但并不总是完全匹配。 一旦你有了IMP,你需要将它转换为函数指针,该指针包含ARC需要的所有细节(包括两个隐含的隐含参数self和_cmd每个Objective-C方法调用)。这是在第三行处理的((void