我有以下问题:在一个执行流程中我使用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];
答案 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];