我正在学习来自一种垃圾收集语言的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方法中释放它吗?
在我挣扎的时候,任何帮助都很有用。
麦克
答案 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
尝试一下,知道它。