6

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

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

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

如果我理解正确(从这里和其他人的答案),在这种情况下 performSelector导致泄漏(如果我错了请纠正我,然后我可以禁用警告并完成它)。选择器的实现如下:

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

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

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

4

1 回答 1

5

objectWithFile:不是“alloc、copy、init、mutableCopy 和 new 系列” 的方法,因此是“Clang/ARC 文档”意义上的“未保留的返回值”方法:

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

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

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

于 2013-08-03T14:18:35.717 回答