我问的是合乎逻辑的问题。如果我先释放池然后释放对象,是否会从内存中释放对象?例如,这是我的代码段:
[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环境下执行。
答案 0 :(得分:1)
这没关系,因为您从未将imageData对象添加到自动释放池中,因此池不会释放它。如果您已将imageData对象添加到自动释放池,如下所示:
[[[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:strUrl]] autorelease];
额外的版本将过度发布,您的应用可能会崩溃。
看起来你已经泄露myImage
,因为它永远不会被释放。
答案 1 :(得分:1)
当你调用[pool release];
立即解除分配时,不会发生添加到池中的自动释放对象。因此,当您显式调用release
时,您的imageData的引用计数将减少1.当池释放时,应用程序将因解除分配的实例或发送到nil对象的消息而崩溃。