【问题标题】:Does removing an object from NSArray automatically release its memory?从 NSArray 中删除一个对象会自动释放它的内存吗?
【发布时间】:2011-10-19 15:51:10
【问题描述】:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

myClass *obj = [[myClass alloc] init];

NSArray *ar = [NSArray array];

[ar addObject: obj];

[ar removeObject: obj];

[pool drain];

从 NSArray 数组中删除对象会自动释放我之前分配的内存吗?从我从各种来源找到的答案似乎是肯定的。问题是如果我测试内存泄漏,xcode 仍然抱怨 obj 没有被释放。那么到底发生了什么?

【问题讨论】:

    标签: objective-c memory-management memory-leaks nsarray


    【解决方案1】:

    集合保留您添加到其中的对象,并声明临时所有权。当您从集合中删除一个项目时,它会释放该对象(及其临时声明)。换句话说,在将对象添加到集合之前和移除对象之后,保留计数是相同的。

    如果保留计数为 0,则回收内存。

    在您的代码中,您正在分配一个对象并声明对它的所有权。这意味着它的保留计数为 1。

    然后你将它添加到数组中。数组保留对象,获取临时所有权并将其保留计数增加到 2。

    然后从数组中删除对象。数组释放对象并放弃任何所有权声明,使保留计数回落到 1。

    由于在保留计数回到 0 之前不会回收内存(没有人对对象拥有所有权),因此不会回收对象的内存。

    如果您在将对象添加到数组之前自动释放了对象,或者在删除对象后调用了释放(但不能同时调用两者!),则保留计数将为 0,并且内存将被回收。

    【讨论】:

      【解决方案2】:

      是的。当您将对象插入数组时,数组会保留它(增加其保留计数)。如果对象的保留计数为 1(即,其上没有其他保留),则当它从数组中删除时,保留计数变为零,并且有资格被删除。

      但是您在上述情况下的问题是,在将对象添加到数组后,您未能释放对象上的保留(由于分配/初始化)。在[ar addObject:obj] 之后插入[obj release]

      (另请注意,在您的示例中,当您耗尽自动释放池时,整个数组将“噗”地一声。)

      【讨论】:

      • “从 NSArray 数组中删除一个对象会自动释放我之前分配的内存吗??” - 严格来说答案是否定的。它不会释放您分配的内存,只会释放数组本身发送的保留。
      • 请注意,您的“另请注意”可能具有误导性:当池耗尽时,数组将收到release,但其中的对象将继续存在,因为它们也属于其他对象。
      • 是的,如果它们被其他人拥有,它们将继续存在,符合保留的“合同”。
      【解决方案3】:

      不,你分配它 -> 保留计数 1

      您将它添加到向对象发送另一个保留的数组中 -> 2

      你从数组中移除对象,数组发送释放 -> 1

      ...所以现在保留计数又回到了 1,这是您最初的分配保留,因此您需要释放它以释放内存。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-24
        • 1970-01-01
        • 2017-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多