NSMutableArray和内存管理

时间:2011-02-22 08:52:29

标签: iphone ios memory-management release-management retain

我正在学习来自一种垃圾收集语言的Objective C,我正在努力进行内存管理。特别是我正在努力解决在这种情况下发生的事情。

// Global variable
NSMutableArray *parentArray;

// Instance
- (void)testing {
  parentArray = [[NSMutableArray alloc] init]; 
  NSMutableArray *childArray = [[NSMutableArray alloc] init];

  [childArray addObject:@"mike"];
  [parentArray addObject:childArray];
}

childArray是一个指向数组的指针,所以当我将它添加到parentArray时它会复制它还是传递指针?如果像我想的那样,它传递指针我不能在这个方法中[childArray release],因为它会破坏对象,我将无法在其他地方读取它。

因此,我必须在课程结束时在主dealloc方法中释放它吗?

在我挣扎的时候,任何帮助都很有用。

麦克

5 个答案:

答案 0 :(得分:4)

您可以在同一个函数中释放childArray,因为NSMutableArray会保留所有添加的对象。

答案 1 :(得分:3)

NSMutableArray(以及所有其他标准objective-c容器)保留添加到其中的对象,因此您可以在childArray添加到parentArray之后立即释放它。

此外,立即发布将提高您的代码可读性 - 因为很明显对象所有权传递给parentArray。

答案 2 :(得分:0)

将childArray添加到parentArray时,它会保留一次。因此,在这一点上,你将在保留计数中有2个相似的值。因此,您可以在方法(测试)中轻松释放childArray并在parentArray中保留引用(保留count = 1)。它不会被销毁。

答案 3 :(得分:0)

只需在childArray声明中添加“autorelease”,以便尽可能释放数组(当释放拥有该子元素的parentArray时,将释放childArray)。

// Global variable
NSMutableArray *parentArray;

// Instance
- (void)testing {
  parentArray = [[NSMutableArray alloc] init]; 
  NSMutableArray *childArray = [[[NSMutableArray alloc] init] autorelease];

  [childArray addObject:@"mike"];
  [parentArray addObject:childArray];
}

- (void) dealloc {
   [parentArray release];
}

答案 4 :(得分:-2)

addObject:只需添加对象指针,并保留添加的对象。 当removeObject:数组删除项(指针),item将收到释放消息。

  • 当您NSMutableArray *childArray = [[NSMutableArray alloc] init]; childArray retainCount为1时。
  • 当您[parentArray addObject:childArray]; childArray retainCount为2时。

当retainCount为0且内存不足时,该对象将被销毁。

有相同的代码:

NSMutableArray *parentArray;

parentArray = [[NSMutableArray alloc] init]; 
NSMutableArray *childArray = [[NSMutableArray alloc] init];
NSLog(@"1.childArray retainCount:%d",[childArray retainCount]);
[childArray addObject:@"mike"];
NSLog(@"2.childArray retainCount:%d",[childArray retainCount]);
[parentArray addObject:childArray];
NSLog(@"3.childArray retainCount:%d",[childArray retainCount]);
[parentArray removeAllObjects];
NSLog(@"4.childArray retainCount:%d",[childArray retainCount]);

结果:

1.childArray retainCount:1
2.childArray retainCount:1
3.childArray retainCount:2
4.childArray retainCount:1

尝试一下,知道它。