【问题标题】:NSMutableArray EXC_BAD_EXCESS SIGBUSNSMutableArray EXC_BAD_EXCESS SIGBUS
【发布时间】:2010-04-13 11:32:13
【问题描述】:

由于我在计时器中设置了以下代码,因此我有以下代码会在一段时间后导致崩溃:

CGImageRef cgImage = UIGetScreenImage();
[array addObject:(id)cgImage];
CGImageRelease(cgImage);

最初我将array 声明为:

array = [[NSMutableArray alloc] init];

计时器一直运行到 10 秒,因为计时器在 10 秒后崩溃了 1/10 秒。

我认为应用程序因EXC_BAD_EXCESS 而崩溃,但不知道如何解决。 有人可以帮忙解决问题吗?

感谢 Adv.

【问题讨论】:

  • 您在这一行收到任何警告吗...?清理并重建项目,看看这一行是否有任何警告......
  • 不,当我在设备中运行时,此行没有警告,崩溃日志显示 EXC_BAD_EXCESS

标签: iphone objective-c nsmutablearray cgimage


【解决方案1】:

addObject: 如果对象为 nil,将引发异常。试试这个:

array = [[NSMutableArray alloc] initWithCapacity:1]; //designated initializer
CGImageRef cgImage = UIGetScreenImage();
if(cgImage)
{
    [array addObject:cgImage];
    CGImageRelease(cgImage);
}

【讨论】:

  • 我不断添加到数组中,所以我如何初始化容量为 1。还有其他方法可以实现这个逻辑吗?
  • 容量1只是初始内存预留,NSMutableArray会根据需要扩展。如果您知道分配后不久,您将添加至少 12 个对象,然后使用 initWithCapacity:12。这个想法是给 NSMutableArray 一个合理的估计它应该保留的内存量,它不是最大容量。
【解决方案2】:

从 Apple 开发者论坛到 UIGetScreenImage():

在使用此功能时,请注意 它返回一个保留的 CGImageRef 并相应地管理你的记忆。

【讨论】:

    【解决方案3】:

    你确定要发布 cgImage 吗?

    我没有看到 UIGetScreenImage() 的文档,但如果它遵循 Create Rule,我不希望您需要释放对象(因为该函数没有“创建”或“复制”在其名称)。

    编辑: 从那以后,我发现几个references 说你确实需要释放图像,尽管函数的名称是这样的。 (在 3.2 SDK 中显然已重命名为 UICreateScreenImage()

    【讨论】:

      猜你喜欢
      • 2020-09-10
      • 1970-01-01
      • 2012-09-04
      • 2015-10-11
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      相关资源
      最近更新 更多