取消分配自定义对象的NSMutableArray

时间:2010-03-17 18:59:57

标签: objective-c nsmutablearray dealloc memory-management

我需要帮助解除我的自定义对象的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]];

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

2 个答案:

答案 0 :(得分:5)

我认为您不了解Cocoa中的内存管理是如何工作的。该数组将保留您添加到其中的对象,当阵列不再需要它时(例如释放数组时),它将自行释放它们。

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

你应该真的重新审视documentation,尤其是关于Object Ownership and Disposal的部分。

答案 1 :(得分:3)

执行此操作的正确方法是让阵列保持自定义对象的所有权:

NSMutableArray * array = [[NSMutabelArray alloc] init];

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

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