【问题标题】:With an NSArray of object references, do I explicitly release all objects in the array or just the array itself?使用对象引用的 NSArray,我是显式释放数组中的所有对象还是仅释放数组本身?
【发布时间】:2010-10-27 12:23:07
【问题描述】:

我的班级有一个充满对象的 NSArray。在我的 dealloc 方法中,我可以简单地在我的 NSArray 上调用 release,还是需要先迭代数组并释放所有对象?

【问题讨论】:

    标签: iphone objective-c memory-management


    【解决方案1】:

    您可以直接在NSArray 上致电发布。 NSArray 的实现将负责将release 发送到存储在数组中的所有对象。

    【讨论】:

    • 应该添加:如果您对其中一个包含的对象有保留计数,那么您应该在将其添加到数组之前自动释放
    • 我很困惑。为什么我必须在 将其添加到数组之前自动释放?例如,我不能在将其添加到数组后显式执行“释放”吗?例如[数组对象添加对象:我的对象]; [myObject 发布];
    • @Heng-Cheong Leong 是的,这也是可以接受的。关键是不要冒险让您的对象在被数组保留之前被释放。
    • 这听起来与我刚刚在以下博客中读到的内容相矛盾:memo.tv/memory_management_with_objective_c_cocoa_iphone 他说向数组添加对象会增加引用计数。所以,实例化它给我一个,添加到一个数组给我两个。如果这是正确的,释放我的 NSArray 将使引用计数减 1,我仍然需要显式调用 release。这是不正确的吗?
    • 这不是错误的。但这也不意味着您需要遍历数组并自己释放所有对象。如果你按照 Heng-Cheong 所说的去做,并在将对象添加到数组后立即释放它,你就不会遇到这个问题。您只需要注意,将对象添加到集合会使保留计数增加 1,而释放该集合(或从该集合中删除对象,假设它是可变集合)会将保留计数减少 1。
    【解决方案2】:

    NSArray 在添加对象时保留对象,并在删除对象或释放数组时释放它们。请记住这一点,保留/释放内存管理正是基于这种“所有权”概念。拥有数组的对象也是如此,如果它还保留了数组中的对象,您将需要在您的 dealloc 实现中向它们发送另一个释放消息。如果没有,并且没有其他对象保留它们,那么一旦数组释放它们,它们就会被释放。

    【讨论】:

    • 谢谢,你的第一句话拯救了我的一天!
    【解决方案3】:

    你应该能够只释放 NSArray,它会释放它的所有对象,不管你是否持有对它们的其他引用。如果您有一个也存在于 NSArray 中的实例对象,则必须显式释放该对象 - 仅释放 NSArray 可能不会解除数组上下文之外的对象。

    【讨论】:

    • 释放一个 NSArray 将总是释放它的所有对象,而不管其他引用(这可能会或可能不会导致它们立即被释放,具体取决于其他引用) ;你把“release”和“dealloc”混为一谈了。
    猜你喜欢
    • 2011-12-15
    • 2011-11-18
    • 2015-09-09
    • 2011-01-08
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    相关资源
    最近更新 更多