-(void)invokeMethod
{
NSMethodSignature * sig = [[source class] instanceMethodSignatureForSelector:@selector(mySelector:)];
NSInvocation * invocation = [NSInvocation invocationWithMethodSignature:sig];
[invocation setTarget:myTarget];
[invocation setSelector:@selector(mySelector:)];
MySubClassOfNSInvocationOperation * command = [[[MySubClassOfNSInvocationOperation alloc] initWithInvocation:invocation] autorelease];
//setArgument retains command
[invocation setArgument:&command atIndex:2];
//addOperation retains command until the selector is finished executing
[operationQueue addOperation:command];
}
-(void)mySelector:(MySubClassOfNSInvocation*)command
{
//Do stuff
}
我不确切知道发生了什么,但NSInvocation
& MySubClassOfNSInvocationOperation
正在泄露
当我删除该行时:
[invocation setArgument:&command atIndex:2];
它没有泄漏,所以将命令作为参数传递给某种问题。
答案 0 :(得分:2)
你可能有一个引用计数循环... command
保留invocation
和invocation
保留command
并且既不想释放直到他们自己{{1}的情况方法 - 导致他们永远不会被释放的情况。
您需要确定两者中的哪一个在层次结构上高于另一个,并确保初级对象不保留高级对象。顺便说一句,除非您致电dealloc
,否则NSInvocation
不会保留参数。或者,您可以实现一个retainArguments
方法,手动告诉一个方法释放另一个方法,打破周期。
在我自己的一个项目中发现close
这个确切的问题后,我写了帖子“Rules to avoid retain cycles”。
答案 1 :(得分:-1)
似乎setArgument方法保留缓冲区(在本例中是 - 您的命令对象)。您可以尝试在设置后释放命令。但你应该小心)。当他的应用程序没有在新的iPhone OS上运行时,我的朋友很困惑,因为他通过添加一行附加的发布消息纠正了Apple的泄密。当苹果在新操作系统中进行修正时,这条线就是崩溃应用程序的原因)
答案 2 :(得分:-2)
这条额外的&符号是什么:
[invocation setArgument:&command atIndex:2];
您正在传递指针的指针指针。这对我来说似乎不对。