“执行选择器可能会导致泄漏”的选择,当它泄漏?
我必须在类(不是实例)上按名称执行选择器并使用它的返回值:
id obj = [objClass performSelector:NSSelectorFromString(methodName) withObject:p1];
选择器创建该类的新实例。 我需要使用返回的实例。 很明显,我得到了通常的performSelector可能导致泄漏,因为它的选择器是未知的警告,因为这个项目是用ARC编译的。
如果我理解正确(从这里和其他人的答案),在这种情况下,performSelector 会导致泄漏(如果我错了,请纠正我,然后我可以禁用警告并完成它)。 选择器的实现如下:
+ (id) objectWithFile:(NSString*)p1
{
return [NSKeyedUnarchiver unarchiveObjectWithFile:p1];
}
当我必须使用字符串中的选择器并且选择器创建并返回对象的新实例时,我有什么选择?
我认为NSInvocation但它的getReturnValue
方法要求我提供我自己分配的缓冲区,其中存储了返回值。 我不确定这是否适用于ARC和类方法,或者我是否只需将__bridge_transfer
将__bridge_transfer
返回值缓冲区转换为id
,这就是它的全部内容。
objectWithFile:
不是“alloc,copy,init,mutableCopy和new family”的方法,因此是“Clang / ARC文档”意义上的“Unretained return values”方法:
返回可保留对象类型但不返回保留值的方法或函数必须确保对象在返回边界内仍然有效。
...
在最坏的情况下,这可能涉及自动释放,但呼叫者不能认为该值实际上在自动释放池中。
所以不管你在方法内部做了什么,调用者都不必释放返回的对象。
所以我不认为你的代码中有内存泄漏。
链接地址: http://www.djcxy.com/p/19949.html上一篇: "performSelector may cause a leak" alternative when it DOES leak?