未分配对象指针的 iOS Objec-C 错误

Posted

技术标签:

【中文标题】未分配对象指针的 iOS Objec-C 错误【英文标题】:iOS Objec-C error for object pointer being freed was not allocated 【发布时间】:2011-07-07 13:22:12 【问题描述】:

我在 xcode 中收到以下错误。

对象 0x4e18d00 的错误:未分配被释放的指针 ** 在 malloc_error_break 中设置断点以进行调试

我已经在目标中设置了 NSZombieEnabled,所以我可以查看调用。这是

-[___NSArrayI 发布]

看起来我已经在我的代码中的其他地方释放了一些数组,然后自动释放池在它已经被释放时也试图释放它。

我怎样才能知道在哪里?有什么想法吗?

仅供参考,我正在使用arrayWithCapacity 方法或类似方法创建所有数组,切勿使用allocinit 方法。我没有看到我在哪里发布这些相同的数组。 (也许我是瞎子!!)

另外,控制流程如下:我点击UIButton,触发附加到onclick的函数。这将进入各个逻辑层,然后返回NSArray。然后我可以在“onClick 按钮函数”中迭代这个数组并打印内容。 当此“onClick 按钮功能”退出时,我在“main”方法中收到上述错误。

另一个注意事项是,在一个函数中,我创建了一个 NSMutableArray,但想要返回一个 NSArray,所以我使用了 [[mutableArray copy] autorelease]。这样可以吧?

任何建议都将不胜感激,因为我经常很难找到错误的原因。

提前致谢。

【问题讨论】:

你有没有按照它的建议在malloc_error_break上设置一个断点,然后在调试器中运行代码? 我正要更新我的问题,并询问如何在 xcode 4 中解决这个问题。我之前尝试过但无法弄清楚.. 有没有这方面的教程? 对不起,我只知道在 Xcode 3 中怎么做。 断点选项卡,底部+号,添加符号断点,在符号中输入malloc_error_break然后点击完成。 我已经添加了断点(就像我之前尝试过的那样),但仍然没有。在那一点上它甚至似乎都没有破裂。 【参考方案1】:

我知道出了什么问题..

在书籍类中,我将章节声明为 NSAray,在默认构造函数中我说

chapters = [NSArray array];

我把它从构造函数中取出来了,一切都很好。 谢谢你们的帮助。

附:如果我忘记了有人可以将此标记为已接受的答案吗?干杯;)

【讨论】:

【参考方案2】:

当您的应用崩溃时,您可以看到您的应用在哪一行崩溃,您还可以看到在崩溃发生之前调用的函数序列。我认为这条线导致崩溃 [[mutableArray copy] autorelease]。因为你没有保留它。复制返回一个自动释放的对象。您可以在文档中看到函数返回的内容。在objective-c中通常返回一个自动释放的对象。

【讨论】:

这是不正确的,这里是来自 NSCopying 协议的文档,记住发件人是你。 “返回的对象由负责释放它的发送者隐式保留。如果“不可变与可变”的考虑适用于接收对象,则返回的副本是不可变的;否则副本的确切性质由类确定。” 记住 NARC(new、alloc、retain、copy/mutableCopy)返回一个拥有的对象。 好的,我找到了问题所在。我有一个包含章节的书籍对象..(章节对象的 NSArray)我将 mutableArray 放入 book.chapters。评论那条线解决了我的问题。我尝试使用 [mutableArray copy] 将章节放在那里,但它仍然崩溃。有任何想法吗?谢谢。

以上是关于未分配对象指针的 iOS Objec-C 错误的主要内容,如果未能解决你的问题,请参考以下文章

被释放的指针未分配,即使它之前已分配

C++ - 未分配被释放的指针

覆盖函数指针引发错误:非对象类型不可分配

Parse.com 云代码 afterSave() 错误:“未捕获尝试使用指向新的未保存对象的指针保存对象。”

java中的对象内存分配和访问

对象的创建与内存分配