我有这样的代码:
- (void) firstMethod{
NSString *first = @"Hello";
NSString *second = @"World";
NSArray *myFirstArray = [[NSArray alloc] initWithObjects: first, second, nil];
[mySecondArray addObject :myFirstArray];
[myFirstArray release];
}
当我释放myfirststarray时,我可以丢失我的两个字符串吗?还是继续存储在mySecondArray中?
第一个和第二个在创建对象时保留计数为1(自动释放)。
添加到数组中的每个对象都会增加其保留计数。
因此,当将first和second添加到firststarray时,它们的保留计数增加到2(其中1为自动释放)。当将这些对象从firststarray添加到secondArray时,firststarray没有发生任何变化,但是first和second在firststarray中被找到并再次添加到secondArray中,因此它们的保留计数再次被提升为3(包括自动释放的1)。
如果你释放第一个数组,它自己的保留计数减少,并且它"包含"的每个对象的保留计数也减少。因此,数组的保留计数为0,并从内存中删除。第一个和第二个的保留计数减少到2(包括1个自动释放)。
如果你等待一段时间,自动释放效果被触发,并且第一和第二的保留计数减少1,所以它们的保留计数为1,当将第一和第二从firststarray添加到secondArray时设置的1。
只要在内存中保持数组不包含任何对象,但引用(如果你喜欢指针)数组外的对象。
NSArray *myFirstArray = [[NSArray alloc] initWithObjects: @"test1", nil];
创建一个字符串对象,将test1放入其中,将其保留计数设置为1,并使其自动释放。然后将对象的内存地址插入到数组中,该数组也将其自己的保留计数设置为1。
换句话说,myFirstArray是指向指针数组的指针,其中每个对象都有自己的保留计数。
EDIT: addObjectsFromArray:
我又读了一遍问题我看到问题是针对addObject:
所以收据是一样的。假设Retain Count在括号中,AR表示自动释放:
NSString *first = @"Hello";
NSString *second = @"World";
first (1 AR)
second (1 AR)
NSArray *myFirstArray = [[NSArray alloc] initWithObjects: first, second, nil];
myFirstArray (1)first (1 AR + 1)
秒(1 AR + 1)
[mySecondArray addObject :myFirstArray];
mySecondArray (1 AR,假设它是用[NSMutableArray array]创建的;这是缺失的)
myFirstArray(1 + 1)被调用
保留first (1 AR + 1) no change
second (1 AR + 1) no change
[myFirstArray release];
mySecondArray (1 AR) no change
myfirststarray(1) -1,但仍然存在
first (1 AR + 1) no change
second (1 AR + 1) no change
希望你明白了:-)
让我们想象你等一段时间。
触发mySecondArray的自动释放:
mySecondArray (0) KILL然后myfirststarray收到一个释放
myfirststarray (0) KILL然后每个对象进入myfirststarray接收一个释放
首先(1 AR) -1,但仍然存活很短的时间
秒(1 AR) -1,但仍然存活很短的时间等待下一个事件循环一段时间,然后触发字符串的自动释放:
first (0) KILL
second (0) KILL
它们不会被第二个数组存储,但第一个数组将被第二个数组保留。
意思是,当你在第一个数组上调用release时,它不会被释放,直到数组从第二个数组中移除。
第二个数组保留第一个数组。第一个数组保留字符串