2010-09-16 5 views
1

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

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

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

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

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

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

Или codewise:

-(void)my_thread:(NSArray*)parameters; 
{  
    ... do your stuff here, including your autorelease pool dance 
    [parameters release]; 
} 
+0

Спасибо. Мне не обязательно выделять параметры. Мне просто нужно знать, включать ли его в пул автозапуска или нет. Похоже, я не должен, на ваш пример. Это имеет смысл, если это так, я просто хочу быть уверенным. – Synthetix

+0

Параметры должны быть сохранены при вводе. Если вы автоматически оцениваете это или выпускаете его в теле этого метода, это совершенно не имеет значения, но вы должны это сделать или же произойдет утечка. – bbum

Смежные вопросы