Как я могу решить эту утечку памяти? NSInvocation - PullRequest
1 голос
/ 26 октября 2009
-(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 ]

2 голосов
/ 26 октября 2009

Возможно, у вас есть цикл подсчета ссылок ... ситуация, когда command сохраняет invocation, а invocation сохраняет command, и ни один из них не хочет выпускать, пока не появится собственный метод dealloc, что приводит к ситуации, когда они никогда не освободятся.

Вам необходимо решить, какой из этих двух иерархически является старшим по отношению к другому, и убедиться, что младший объект не сохраняет старший. Между прочим - NSInvocation не сохранит аргументы, если вы не вызовете retainArguments. Кроме того, вы можете реализовать метод close, который вручную говорит одному освободить другой, прерывая цикл.

Я написал пост " Правила, чтобы избежать сохранения циклов " после раскрытия этой точной проблемы с NSInvocation в одном из моих собственных проектов.

0 голосов
/ 26 октября 2009

Что с дополнительным амперсандом в этой строке:

[invocation setArgument:&command atIndex:2];

Вы передаете указатель на указатель вашей команды. Это кажется мне неправильным.

0 голосов
/ 26 октября 2009

Кажется, что метод setArgument сохраняет буфер (в данном случае - ваш командный объект). Вы можете попытаться отпустить команду после настройки. Но вы должны быть осторожны). Мой друг был смущен, когда его приложение не запускалось на новой iPhone OS, потому что он исправил утечку Apple, добавив одну строку с дополнительным сообщением о выпуске. И когда Apple внесла исправления в новую ОС, эта строка стала причиной сбоя приложения)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...