崩溃释放由UIImage创建的图像:resizableImageWithCapInsets

时间:2012-07-20 10:01:58

标签: objective-c ios memory-management retain

我最近开始使用iOS编程,并假设我理解了Objective-C引用计数,但似乎我没有...以下代码完全运行但后来使用EXC_BAD_ACCESS使我的应用程序崩溃(代码1或代码2)。

我没有使用ARC(基于PhoneGap的项目)。

for(int i = 0; i < 10; ++i)
{
    UIImage *a = [UIImage imageNamed:@"NavigationBarBackButtonBlack.png"];
    UIImage *b = [a resizableImageWithCapInsets:UIEdgeInsetsMake(0, 13, 0, 7)];
    NSLog(@"a has %d retains, b has %d retains, a==b == %d\n", [a retainCount], [b retainCount], a==b ? 1 : 0);
    [a release];
    [b release];
    NSLog(@"#%d\n", i);
}
NSLog(@"FINISHED\n");

输出正如我所料:

a has 1 retains, b has 1 retains, a==b == 0
#0
a has 1 retains, b has 1 retains, a==b == 0
#1
a has 1 retains, b has 1 retains, a==b == 0
[...snip...]
a has 1 retains, b has 1 retains, a==b == 0
#9
FINISHED

这里有什么问题?是否有一些自动释放,或者上限图像是否保留对原始图像的引用?不知道。

2 个答案:

答案 0 :(得分:3)

imageNamedresizableImageWithCapInsets都返回自动释放的对象。你不应该手动释放它们。

换句话说:如果你没有alloccopyretain它,你就不应该release它!

作为最后的暗示:忘记retainCount属性,它对你来说毫无用处。

答案 1 :(得分:2)

你不应该发布图像a和b。 这些图像是自动释放的。您只应在使用关键字allocnew时执行对象的发布。

这是目标C中内存管理的一个相当不错的入门:

http://interfacelab.com/objective-c-memory-management-for-lazy-people/