Должен ли я оставить пропущенные переменные / объекты из пула автоматического выпуска? - PullRequest
1 голос
/ 16 сентября 2010

У меня есть поток, который изменяет переданный указатель на объект (который выделяется и сохраняется в вызывающем потоке) в цикле.Если я помещаю указатель в пул автоматического выпуска, я иногда получаю ошибки, потому что объект освобождается, когда он не должен.Я вынул его из пула автоматического выпуска, и это, кажется, работает.Однако меня беспокоит утечка памяти, потому что, если я вообще не использую пул автоматического выпуска, я получаю серьезную утечку.

-(void)my_thread:(NSArray*)parameters;
{       
    //keep this out of the autorelease pool
    Object *theObject;
    [[parameters objectAtIndex:2] getValue:&theObject];

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    //do stuff to theObject

    [pool release];
}

1 Ответ

1 голос
/ 16 сентября 2010

Учитывая это:

-(void)my_thread:(NSArray*)parameters;
{       
...
}

Способ только для parameters, чтобы быть действительным, когда указанный метод является точкой входа в поток , если параметры были сохранены по нерестовой нити. Не сохраняется и автоматически освобождается, но просто сохраняется.

Другими словами: пулы авторелизов никогда не могут способствовать безопасности потоков. Автоматически освобожденный объект никогда не сможет безопасно пересечь границы потока. Должно быть жесткое сохранение объекта в потоке-отправителе, и поток-получатель должен освободить указанный объект. Конец истории.

Или по коду:

-(void)my_thread:(NSArray*)parameters;
{     
    ... do your stuff here, including your autorelease pool dance
    [parameters release];  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...