0

我有一个不保留/释放其对象的 CFDictionaryRef。当我在其中添加一个项目时,我会保留它,然后:

NSMutableArray *array = (__bridge_transfer NSMutableArray *)CFDictionaryGetValue(...)
[self performSelector:someSelector withObject:array];

someSelector我知道的保存选择器的变量在哪里。现在,第二行让 Xcode 发出臭名昭著的警告:

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

这是否意味着我应该担心 ARC 不知道如何为array我刚刚转移所有权的变量管理内存?

4

1 回答 1

0

从对该问题的已接受答案的评论来看,苹果公司的某个人似乎已经证实了这一假设(引用了答案本身):

事实上,有时内存管理通过特定约定与方法名称相关联。具体来说,我正在考虑便利构造函数与 make 方法;前者按惯例返回一个自动释放的对象;后者是保留对象。该约定基于选择器的名称,因此如果编译器不知道选择器,则它无法强制执行正确的内存管理规则。

因此,它与传递给调用的参数可能泄漏无关performSelector:,而是与它的返回值有关,Objective-C 无法知道它是否被自动释放。这也是评论中的 Martin R 所假设的。

于 2013-05-30T17:09:29.563 回答