【问题标题】:Is "removeAllObjects" supposed to release?“removeAllObjects”应该释放吗?
【发布时间】:2010-08-27 12:16:16
【问题描述】:

我决定开始使用removeAllObjects,这样我就可以重新使用我的一些 NSMutableArrays。但是,我发现对 removeAllObjects 的调用会导致数组被释放,因此在第二次显示 viewController 时它会崩溃。

我在网上看过,似乎有些人说removeAllObjects 只是清除了他们的数组,而另一些人则说它也释放了数组。哪个是真的?它似乎为我释放,但我觉得这很奇怪,并且希望行为只是释放数组中的对象。文档中没有对此提出警告,我也觉得这很奇怪。

编辑:打开 NSZombies 后,我得到的只是:

  • -[__NSArrayM removeAllObjects]:消息发送到已释放实例 0x625e4e0

基本上告诉我,由于removeAllObjects导致数组被释放,所以不能第二次调用removeAllObjects...唉!

有人可以帮忙吗?

谢谢!

【问题讨论】:

  • 你可以添加一些代码来提供上下文

标签: iphone objective-c memory-management nsmutablearray


【解决方案1】:

removeAllObjects 释放数组中的对象,但对数组本身没有影响(除了使其为空)。

除非

数组中的一个或多个对象保留了对数组本身的引用。

【讨论】:

  • 好主意!但我犯了一个非常愚蠢的错误......将在下面回答。
【解决方案2】:

好吧,我是个白痴!

我在做:

[myArray removeAllObjects];
myArray = someOtherObject.someArray;

因此重置指向其他对象的指针。我现在把它改成了这样:

[self.myArray removeAllObjects];
[self.myArray addObjectsFromArray:someOtherObject.someArray];

现在没事了。我是个白痴!对不起,谢谢您的帮助!

【讨论】:

    【解决方案3】:

    removeAllObjects 不会像您期望的那样释放数组本身。如果它被释放,问题就出在其他地方。您可以使用 NSZombie 的工具来检查它的发布位置。

    【讨论】:

    • 不幸的是,所有 NSZombie 告诉我的是:*** -[__NSArrayM removeAllObjects]: message sent to deallocated instance 0x625e4e0
    【解决方案4】:

    如果您要自动释放 MutableArray,它们可能会在它们为空时被释放,就像在调用 removeAllObjects 之后一样。使用 NSZombies 查看它的确切发布位置。

    【讨论】:

    • 不幸的是,所有 NSZombie 告诉我的是:* -[__NSArrayM removeAllObjects]: message sent to deallocated instance 0x625e4e0
    • 那么你的数组在你调用remove all objects之前已经被释放了,因此这个调用与dealloc'd无关
    • 我发现了问题...将在下面添加...我是个笨蛋:-)
    【解决方案5】:

    NSZombies 无法告诉您对象被释放的位置,因此它会在您第一次向已释放对象发送消息时显示。

    从调用 -removeAllObjects 开始,您会发现错误。

    【讨论】:

      【解决方案6】:

      [yourArray removeAllObjects]; 看来yourArray的元素会自动释放

      【讨论】:

        猜你喜欢
        • 2011-03-21
        • 2017-04-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-06
        • 2011-07-04
        • 2011-04-27
        • 1970-01-01
        • 2011-05-26
        相关资源
        最近更新 更多