__bridge_transfer和performSelector:withObject:

时间:2013-05-30 15:15:52

标签: objective-c core-foundation

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

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

someSelector是一个持有我知道的选择器的变量。现在,第二行让Xcode告诉臭名昭着的警告:

  

PerformSelector可能会因为其选择器未知而导致泄漏

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

1 个答案:

答案 0 :(得分:0)

从评论到this question的接受答案,似乎Apple的某个人已经证实了这个假设(引用答案本身):

  

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

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