Iphone NSMutableArray和内存管理

Iphone NSMutableArray和内存管理,iphone,ios,memory-management,release-management,retain,Iphone,Ios,Memory Management,Release Management,Retain,我正在学习Objective C,它来自一种具有垃圾收集功能的语言,我正在努力进行内存管理。特别是,我正在为这种情况下发生的事情而挣扎 // Global variable NSMutableArray *parentArray; // Instance - (void)testing { parentArray = [[NSMutableArray alloc] init]; NSMutableArray *childArray = [[NSMutableArray alloc]

我正在学习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是指向数组的指针,所以当我将Object添加到parentArray时,它是复制它还是传递指针?如果像我想的那样,它传递了这个方法中我不能[childArray release]的指针,因为它会破坏这个对象,我将无法从其他地方读取它

因此,我必须在类末尾的主dealloc方法中释放它吗

在我挣扎的过程中,任何帮助都会得到极大的感谢

Mike

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

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

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


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

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

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

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

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

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

  • 当您
    NSMutableArray*childArray=[[NSMutableArray alloc]init]时子数组重新计数为1
  • 当您
    [parentArray addObject:childArray]时子数组重新计数为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

试试看,知道它。

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

  • 当您
    NSMutableArray*childArray=[[NSMutableArray alloc]init]时子数组重新计数为1
  • 当您
    [parentArray addObject:childArray]时子数组重新计数为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
试试看,知道它。

只需在childArray声明中添加“autorelease”,这样在可能的情况下该数组将被释放(当您释放拥有该子数组的parentArray时,childArray so将被释放)

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


这是目标,因此我的问题。只要检查它的重新计数。我从未在程序中使用过它。这是目标,因此我的问题。只要检查它的重新计数。我从未在程序中使用过它。