【发布时间】:2015-08-06 08:09:44
【问题描述】:
我有一个场景,在 allocing 一个对象之后调用的初始化程序直到运行时才知道,我无法控制它。它也可能有各种论据。所以目前我正在这样做:
...
id obj = [MyClass alloc];
return [self invokeSelectorOn:obj];
}
-(id) invokeSelectorOn:(id) obj {
SEL initSelector = ...;
NSMethodSignature *sig = [[MyClass class] instanceMethodSignatureForSelector:initSelector];
NSinvocation *inv = [NSInvocation invocationWithMethodSignature:sig];
inv.selector = initSelector;
[inv retainArguments];
// ... setting arguments ...
[inv invokeWithTarget:obj];
id returnValue;
[inv getReturnValue:&returnValue];
return returnValue;
}
我遇到的问题(我认为!)是因为initSelector 被NSInvocation 调用,所以它没有返回retain+1 对象。所以上面的结果是当自动释放池尝试释放对象时崩溃。
我尝试添加修复内存问题的CFBridgingRetain(...),但我不确定这是正确的解决方案,静态分析器将其标记为内存泄漏。
所以我的问题是如何通过 NSInvocation 调用初始化程序并取回正确的 retain+1 对象?
【问题讨论】:
-
为什么创建一个局部变量
obj而不使用呢? -
// ... setting arguments ...会发生什么? -
另外,如果你同步调用它,你不应该使用
retainArguments -
对不起,代码是从原始代码中删减的。因此,拼写错误没有将 obj 传递给该方法。原件确实重用了 NSInvocation,因此保留了。在参数部分,代码做了一些工作来确定和设置初始化器的参数。
标签: objective-c memory nsinvocation