在释放该对象所属的池后释放对象可能会发生什么?

时间:2014-09-19 09:51:11

标签: ios automatic-ref-counting nsthread nsautoreleasepool

我问的是合乎逻辑的问题。如果我先释放池然后释放对象,是否会从内存中释放对象?例如,这是我的代码段:


[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环境下执行。

2 个答案:

答案 0 :(得分:1)

这没关系,因为您从未将imageData对象添加到自动释放池中,因此池不会释放它。如果您已将imageData对象添加到自动释放池,如下所示:

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

额外的版本将过度发布,您的应用可能会崩溃。 看起来你已经泄露myImage,因为它永远不会被释放。

答案 1 :(得分:1)

当你调用[pool release];立即解除分配时,不会发生添加到池中的自动释放对象。因此,当您显式调用release时,您的imageData的引用计数将减少1.当池释放时,应用程序将因解除分配的实例或发送到nil对象的消息而崩溃。