【问题标题】:Crash releasing image created by UIImage:resizableImageWithCapInsets由 UIImage:resizableImageWithCapInsets 创建的崩溃释放图像
【发布时间】:2012-07-20 10:01:57
【问题描述】:

我最近刚开始使用 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

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

【问题讨论】:

  • retainCount 完全没用。不要叫它。

标签: objective-c ios memory-management retain


【解决方案1】:

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

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

最后提示:忘记retainCount 属性,它对你没用。

【讨论】:

  • 现在说得通了 :) 如果在对象上使用自动释放,有没有办法调试此类问题?
  • 请记住,只有在对象上调用 alloc、retain、copy 或 mutableCopy 时,才必须调用 release。每当您调用任何这些引用计数都会增加。由于您没有在对象 a 和 b 上调用任何这些方法,因此您不需要释放该对象
  • 别忘了newmutableCopy
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多