引用计数的减少不正确

时间:2010-06-07 22:04:55

标签: iphone objective-c ios memory-management

我有以下问题:在一个执行流程中我使用alloc,而在另一个流程中,不需要alloc。 在if语句结束时,无论如何,我都会释放该对象。 当我'build and Analize'时,我收到一个错误:'对象的引用计数的不正确的减少不属于调用者'。

如何解决?

UIImage *image; 

int RandomIndex = arc4random() % 10;

if (RandomIndex<5) 
{
    image = [[UIImage alloc] initWithContentsOfFile:@"dd"];
}
else 
{
    image = [UIImage imageNamed:@"dd"];
}


UIImageView *imageLabel =[[UIImageView alloc] initWithImage:image];
[image release];
[imageLabel release];

4 个答案:

答案 0 :(得分:10)

您应该retain处于第二种情况的图片:

image = [[UIImage imageNamed:@"dd"] retain];

这样,从您的角度来看,条件之外的两个可能出口都会有一个引用计数为1的对象。

否则,您正在尝试release已经autorelease d对象!

答案 1 :(得分:8)

您可以执行其他人的建议,或者:

if (RandomIndex<5) 
{
    image = [UIImage imageWithContentsOfFile:@"dd"];
}
else 
{
    image = [UIImage imageNamed:@"dd"];
}

UIImageView *imageLabel =[[UIImageView alloc] initWithImage:image];
...
[imageLabel release];

这样,在这两种情况下,您都会获得一个自动释放的对象image,然后您无需自行释放。

答案 2 :(得分:2)

而不是:

image = [UIImage imageNamed:@"dd"];

执行:

image = [[UIImage imageNamed:@"dd"] retain];

答案 3 :(得分:2)

imageNamed会返回自动释放的对象。 您只能释放您拥有所有权的对象。

这将有效:

if (RandomIndex<5) 
{
    image = [[UIImage alloc] initWithContentsOfFile:@"dd"] autorelease];
}
else 
{
    image = [UIImage imageNamed:@"dd"];
}


UIImageView *imageLabel =[[UIImageView alloc] initWithImage:image];
[imageLabel release];