我有这个代码:
- (void) firstMethod{
NSString *first = @"Hello";
NSString *second = @"World";
NSArray *myFirstArray = [[NSArray alloc] initWithObjects: first, second, nil];
[mySecondArray addObject :myFirstArray];
[myFirstArray release];
}
当我释放myFirstArray时,是否可以丢失两个字符串?还是将它们存储在mySecondArray中?
最佳答案
创建对象时,第一个和第二个的保留计数为1(自动释放)。
添加到数组的每个对象都会增加其保留计数。
因此,将first和second添加到firstArray时,它们的保留计数增加到2(自动释放为1)。
将这些对象从firstArray添加到secondArray时,firstArray不会发生任何事情,但是first和second被发现到firstArray中并再次添加到secondArray中,因此它们的保留计数再次提高到3(包括自动释放的1)。
如果释放第一个Array,则它自己的保留计数会减少,并且它“包含”的每个对象的保留计数也会减少。因此,该数组的保留计数为0,并从内存中删除了该数组。第一个和第二个的保留数减少到2(包括自动释放的1)。
如果等待一段时间,则会触发自动释放效果,并且第一个和第二个的保留计数减少1,因此它们的保留计数为1,这是在将firstArray和first从firstArray添加到secondArray时设置的。
只需在内存中确保该数组不包含任何对象,而是引用(如果需要,可以使用指针)数组之外的对象。
如果你写:
NSArray *myFirstArray = [[NSArray alloc] initWithObjects: @"test1", nil];
它创建一个字符串对象,将test1放入其中,将其保留计数设为1,然后使其自动释放。然后将对象的内存地址插入到数组中,该数组的自身保留计数也设置为1。
换句话说,myFirstArray是指向指针数组的指针,其中每个对象都有其自己的保留计数。
编辑:给出的描述是针对addObjectsFromArray的:
我再次阅读了该问题,发现该问题是针对addObject的:
所以收据是一样的。假设保留计数在括号中,AR表示自动释放:
NSString *first = @"Hello";
NSString *second = @"World";
第一(1 AR)
秒(1 AR)
NSArray *myFirstArray = [[NSArray alloc] initWithObjects: first, second, nil];
myFirstArray(1)
第一(1 AR +1)
秒(1 AR +1)
[mySecondArray addObject :myFirstArray];
mySecondArray(1个AR,假设它是使用[NSMutableArray array]创建的;丢失了)
调用保留的myFirstArray(1 + 1)
第一(1 AR + 1)不变
秒(1 AR +1)不变
[myFirstArray release];
mySecondArray(1 AR)不变
myFirstArray(1)-1,但仍然存在
第一(1 AR + 1)不变
秒(1 AR +1)不变
希望很清楚:-)
假设您等待一段时间。
mySecondArray(0)杀死
myFirstArray(0)杀死
第一次(1 AR)-1,但寿命仍然很短
秒(1 AR)-1,但仍然生活很短
第一(0)杀
秒(0)杀死