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

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

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

如果我正确理解(from the answers here等),在这种情况下,performSelector 引起泄漏(如果我错了,请更正我,然后我可以禁用警告并进行处理)。选择器的实现如下:
+ (id) objectWithFile:(NSString*)p1
{
    return [NSKeyedUnarchiver unarchiveObjectWithFile:p1];
}

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

我考虑过NSInvocation,但是它的getReturnValue方法需要我提供自己分配的缓冲区,用于存储返回值。我不确定这是否可以与ARC和类方法一起使用,或者我是否只需要__bridge_transfer将malloc的返回值缓冲区转换为id即可,仅此而已。

最佳答案

objectWithFile:不是“分配,复制,init,mutableCopy和新家族”的方法
因此是
"Clang/ARC documentation"而言,是“未保留的返回值”方法:



因此,无论您在方法内部执行什么操作,调用者都不必释放该
返回的对象。

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

关于objective-c - "performSelector may cause a leak"替代品何时泄漏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18033462/

10-16 17:01