我该怎么解决这个内存泄漏? NSInvocation的

时间:2009-10-26 10:56:13

标签: iphone objective-c

-(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];

它没有泄漏,所以将命令作为参数传递给某种问题。

3 个答案:

答案 0 :(得分:2)

你可能有一个引用计数循环... command保留invocationinvocation保留command并且既不想释放直到他们自己{{1}的情况方法 - 导致他们永远不会被释放的情况。

您需要确定两者中的哪一个在层次结构上高于另一个,并确保初级对象不保留高级对象。顺便说一句,除非您致电dealloc,否则NSInvocation不会保留参数。或者,您可以实现一个retainArguments方法,手动告诉一个方法释放另一个方法,打破周期。

在我自己的一个项目中发现close这个确切的问题后,我写了帖子“Rules to avoid retain cycles”。

答案 1 :(得分:-1)

似乎setArgument方法保留缓冲区(在本例中是 - 您的命令对象)。您可以尝试在设置后释放命令。但你应该小心)。当他的应用程序没有在新的iPhone OS上运行时,我的朋友很困惑,因为他通过添加一行附加的发布消息纠正了Apple的泄密。当苹果在新操作系统中进行修正时,这条线就是崩溃应用程序的原因)

答案 2 :(得分:-2)

这条额外的&符号是什么:

[invocation setArgument:&command atIndex:2];

您正在传递指针的指针指针。这对我来说似乎不对。