【问题标题】:Incorrect decrement of the reference count引用计数的不正确递减
【发布时间】:2010-06-07 22:04:55
【问题描述】:
我有以下问题:在一个执行流程中我使用 alloc,而在另一个流程中,不需要 alloc。
在 if 语句的末尾,无论如何,我都会释放对象。
当我执行“构建和分析”时,我收到一个错误:“调用者不拥有对象的引用计数的错误递减”。
如何解决?
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];
【问题讨论】:
标签:
iphone
objective-c
ios
memory-management
【解决方案1】:
你应该retain第二个条件中的图片:
image = [[UIImage imageNamed:@"dd"] retain];
从您的角度来看,这样,两个可能的退出条件都会有一个引用计数为 1 的对象。
否则,您正在尝试 release 一个已经 autoreleased 的对象!
【解决方案2】:
您可以按照其他人的建议去做,或者:
if (RandomIndex<5)
{
image = [UIImage imageWithContentsOfFile:@"dd"];
}
else
{
image = [UIImage imageNamed:@"dd"];
}
UIImageView *imageLabel =[[UIImageView alloc] initWithImage:image];
...
[imageLabel release];
这样,在这两种情况下,您都会得到一个自动释放的对象image,然后您就不需要自己释放它了。
【解决方案3】:
代替:
image = [UIImage imageNamed:@"dd"];
做:
image = [[UIImage imageNamed:@"dd"] retain];
【解决方案4】:
imageNamed 返回一个 autoreleased 对象。
您只能释放您拥有所有权的对象。
这将起作用:
if (RandomIndex<5)
{
image = [[UIImage alloc] initWithContentsOfFile:@"dd"] autorelease];
}
else
{
image = [UIImage imageNamed:@"dd"];
}
UIImageView *imageLabel =[[UIImageView alloc] initWithImage:image];
[imageLabel release];