我最近开始使用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
这里有什么问题?是否有一些自动释放,或者上限图像是否保留对原始图像的引用?不知道。
答案 0 :(得分:3)
imageNamed
和resizableImageWithCapInsets
都返回自动释放的对象。你不应该手动释放它们。
换句话说:如果你没有alloc
,copy
或retain
它,你就不应该release
它!
作为最后的暗示:忘记retainCount
属性,它对你来说毫无用处。
答案 1 :(得分:2)
你不应该发布图像a和b。
这些图像是自动释放的。您只应在使用关键字alloc
或new
时执行对象的发布。
这是目标C中内存管理的一个相当不错的入门:
http://interfacelab.com/objective-c-memory-management-for-lazy-people/