" performSelector可能导致泄漏"什么时候泄漏?

时间:2013-08-03 13:40:53

标签: objective-c memory-leaks automatic-ref-counting performselector

我必须在类(不是实例)上按名称执行选择器并使用其返回值:

id obj = [objClass performSelector:NSSelectorFromString(methodName) withObject:p1];

选择器创建Class的新实例。我需要使用返回的实例。显然我得到了通常的 performSelector可能导致泄漏,因为它的选择器是未知的警告,因为这个项目是用ARC编译的。

如果我理解正确(from the answers here和其他人),在这个例子中,performSelector 导致泄漏(如果我错了,请纠正我,然后我可以禁用警告并完成它)。选择器的实现如下:

+ (id) objectWithFile:(NSString*)p1
{
    return [NSKeyedUnarchiver unarchiveObjectWithFile:p1];
}

当我必须使用字符串中的selector并且选择器创建并返回该对象的新实例时,我有什么选择?

我考虑过NSInvocation,但是它的getReturnValue方法要求我提供我自己分配的缓冲区,其中存储了返回值。我不确定这是否适用于ARC和类方法,或者我是否只需__bridge_transfer将malloc的返回值缓冲区转换为id,这就是它的全部内容。

1 个答案:

答案 0 :(得分:5)

objectWithFile:不是“alloc,copy,init,mutableCopy和new family”的方法 因此是 "Clang/ARC documentation"

意义上的“未获得的返回值”方法
  

返回可保留对象类型的方法或函数   不返回保留值必须确保对象仍然有效   越过回程边界   ...
  在最坏的情况下,这可能涉及自动释放,但呼叫者必须   不要假设该值实际上在自动释放池中。

所以无论你在方法中做什么,调用者都不必释放 返回的对象。

因此,我认为您的代码中没有内存泄漏。