2014-09-19 4 views
0

Я задаю только логичный вопрос. Будет ли объект выпущен из памяти, если я сначала освобожу пул, а затем отпустите объект? Например, вот мой фрагмент кода:Что может произойти, если я освобожу объект, после выпуска пула, к которому принадлежит этот объект?


[self performSelectorInBackground:@selector(setImage) withObject:nil]; 

-(void)setImage 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; 

    NSString *strUrl = @"--some URL--"; 

    NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:strUrl]]; 
    UIImage *myimage = [[UIImage alloc] initWithData:imageData]; 

    [pool release]; 
    [imageData release]; 
} 

Предположим, что фрагмент кода выполняется в соответствии с не-ARC среде.

ответ

1

Это будет нормально, поскольку вы никогда не добавляли объект imageData в пул автоопределений, поэтому пул не выпустит его. Если вы добавили объект ImageData в autorelease бассейне, как это:

[[[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:strUrl]] autorelease]; 

Дополнительный выпуск был бы overrelease и ваше приложение может произойти сбой. Похоже, вы пропустили myImage, так как это никогда не выпускается.

+0

Как это будет перевыпущено, если я использую autorelease в своем фрагменте кода? Потому что пул отвечает за отправку сообщения о выпуске. Но в моем случае я освобождаю объект после того, как пул выпустил сам. Поправьте меня, если я понял что-то не так. – NSPratik

+1

Если вы добавите 'autorelease' в' imageData', тогда при его создании у него будет счетчик удержания 1, когда пул авторесурсов освободит счет сохранения «imageData', будет уменьшаться, и он будет отменен. Если вы затем попробуете и отпустите «imageData», вы получите крах. Если вы добавите 'autorelease' в' myImage', он будет работать нормально. –

+0

Итак, когда выполнение приходит в _ [release_DataData] _, объект imageData не будет найден и вызовет сбой. – NSPratik

1

, когда вы вызываете [pool release]; немедленное освобождение не происходит с объектами автообновления, которые добавляются в пул. Поэтому, когда вы явно вызываете release, ваш счетчик ссылок imageData будет уменьшен на 1. Когда пул освободит приложение, произойдет сбой с деаллоцированным экземпляром или сообщением, отправленным на объект nil.

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