【问题标题】:Deallocating NSMutableArray of custom objects释放自定义对象的 NSMutableArray
【发布时间】:2011-01-28 17:36:44
【问题描述】:

我需要帮助解除我的 NSMutableArray 自定义对象。我需要保留数组,所以我在 .h 中添加了一个属性,并在 .m 文件中的 dealloc 中释放它。当我将对象添加到数组时,我会执行以下操作:

  myarray = [[NSMutableArray alloc] init];
  [myarray addObject:[[mycustomObject alloc]initWithObject:obj1]];
  [myarray addObject:[[mycustomObject alloc]initWithObject:obj2]];

现在,我不知道如何释放 mycustomobject。如果我执行以下操作:

   [myarray addObject:[[[mycustomObject alloc]initWithObject:obj1] autorelease]];

我稍后访问数组时遇到了问题。请指教。

【问题讨论】:

  • 我在最后一行的末尾添加了缺少的括号。这种方法是完全正确的,所以你一定是在做一些奇怪的事情。如果可变数组被自动释放,预计在某些时候它会被释放,尝试使用它会导致崩溃。

标签: objective-c nsmutablearray dealloc memory-management


【解决方案1】:

我认为您不了解 Cocoa 中的内存管理是如何工作的。数组会保留你添加到里面的对象,当数组不再需要它们时(比如你释放数组时)它会自行释放。

换句话说,将自动释放的对象添加到数组中,之后不用担心它的保留计数。如果你想从数组中删除它,只需删除它(使用removeObjectAtIndex: 或类似的东西)。如果您认为要释放对象而不将其从数组中删除,那么您做错了,因为这可能会在您的数组中留下一个悬空指针,这将导致您稍后崩溃。

你真的应该再看一遍documentation,尤其是Object Ownership and Disposal的部分。

【讨论】:

    【解决方案2】:

    正确的做法是让数组保持自定义对象的所有权:

    NSMutableArray * array = [[NSMutabelArray alloc] init];
    
    for (id obj in anArrayOfObjects) {
      mycustomObject * customObj = [[mycustomObject alloc] initWithObject:obj];
      [array addObject:customObj];
      [customObj release];
    }
    

    如果您以后在访问数组时遇到困难,那么您在数组的内存管理方面做错了。

    【讨论】:

    • 好的,这很尴尬。 [myarray addObject:[[[mycustomObject alloc]initWithObject:obj1] autorelease];实际上按预期工作。我记得一开始就看到它的问题,可能是一个不同的故障。感谢大家的再次肯定!
    • @Dave 你的回答当然是正确的,但他的方法(使用自动释放)也是正确的,而且更短。我理解避免自动释放背后的意图,但它是如此之快,而且开销如此之小,以至于更短通常是一种更容易的方法。特别是当数组中的对象会存在一段时间时,我们不只是创建很多临时临时对象。即便如此,一个正确而有帮助的答案还是值得一票的...... ;-)
    • @Quinn @Dave - 是的,将其包装在 autorelease 中效果很好(因为您放弃了所有权)并且完全可以接受。避免方法调用的深度嵌套是我个人的偏好。 IMO,将其分成不同的行使其更具可读性和清晰性。
    • (注意:我通过 IM 告诉戴夫,在大多数体面的编辑器(包括 Xcode 和 BBEdit)中双击括号会突出显示括号之间的所有代码。对于深度嵌套的方法调用,这是一种直观地解析您正在查看的内容的好方法。自动释放是我的偏好,因为所有内存管理都在一个地方,而不是等待意外修剪的浮动释放。我以前对自己做过。)
    • 在处理自定义对象时(即比[NSNumber numberWithInt:i] 或其他更复杂的东西),我喜欢将事情分成不同的行,因为我通常还必须在之前对对象进行其他自定义将其添加到数组中。同样,这只是一种风格选择,这是我的风格。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多