【问题标题】:EXEC_BAD_ACCESS when releasing a copied object释放复制对象时的 EXC_BAD_ACCESS
【发布时间】:2012-01-21 16:48:26
【问题描述】:

这让我很生气..因为它是一个内存管理问题...

我在类 2 中创建了一个 NSArray

@property (nonatomic, copy) NSArray * sourceArray;

我从另一个类中设置了这个数组,比如 Class 1 ...

Class2 = [[Class2 alloc] initWithFrame:self.bounds];
[Class2 setSourceArray:self.namesArray];

我确信 self.namesArray 包含对象。

当我发布 Class 1 时,它会发布 Class 2,因为 Class 2 是 Class 1 中的子视图,这是预期的,但是当 Class 2 在 dealloc 中释放 sourceArray 时,我得到一个 EXEC_BAD_ACCESS...

[sourceArray release];

如果我不在 Class 1 中发布 namesArray,我不会收到此错误。这没有意义,因为我使用我将 sourceArray 声明为 COPY,据我所知,这为 Class 2 提供了它自己的数组版本。 .

有人可以帮我吗?它杀了我!

更多信息: 在我尝试释放 sourcearray 之前的引用计数是 1... 那么为什么释放不起作用?!

【问题讨论】:

  • 您是否尝试过使用 Instruments 中的 Zombies 工具来诊断您的问题?
  • 不要在class2中释放数组,可能是你在使用这个数组包含在class1中
  • 崩溃时我得到的只是 -[CFString release]: message sent to deallocated instance 0x2a9530 但这没有意义,因为我从 Class1 复制了对象,对吧?
  • 如果我不在任何一个类中释放它,我将使用分析器得到一个泄露的数组。
  • 正如你所说,它给出了-[CFString release]:消息发送到已释放的实例 0x2a9530,但 sourceArray 是 NSArray。您确定崩溃发生在 [sourceArray release] 行吗?如果是这样,那么当您将其复制到 sourceArray 时,self.namesArray 可能超出范围。否则是因为你过度释放了一些字符串。

标签: iphone objective-c ios memory-management exc-bad-access


【解决方案1】:

这没有意义,因为我使用我声明 sourceArray 为 COPY,据我所知,它为 Class 2 提供了它自己的数组版本。

这就是想法,但它可能会帮助您知道-copy 通常只保留不可变对象的对象。这对您的代码应该无关紧要,因为原始对象与不可变对象的副本无法区分。可能是您在 Class1 中过度释放数组,而问题仅在 Class2 释放它是数组的“副本”时出现。

【讨论】:

  • 我不认为我在 Class1 中释放过多,因为如果我不在 dealloc 中释放我有一个泄漏的对象。我收到 -[CFString release]: message sent to deallocated instance.. 所以这意味着当我释放数组时它很好,但它包含的至少一个 NSStrings 可能被过度释放了?就像在 Class1 中一样,当我释放数组时,它正在释放数组中的每个字符串,这使得 Class 2 中的数组不包含任何对象?
  • 我上面说的是,Class2 中的数组很可能是 Class1 中的数组。这并不能解释问题,但它可能会通知您的调试。当然,如果导致错误的消息是一个release 发送到一个字符串,这是一个重要的线索。鉴于现有信息的数量,恐怕我们可以说的不多了。不过,坚持下去……你会找到的。
  • 好的修复它..只是改变了我将字符串添加到初始数组的方式......谢谢大家希望我能接受你们!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 2011-09-19
相关资源
最近更新 更多