我有这个代码:

- (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的自动释放:
    mySecondArray(0)杀死
  • ,然后myFirstArray收到发布
    myFirstArray(0)杀死
  • 然后进入myFirstArray的每个对象都会收到一个释放
    第一次(1 AR)-1,但寿命仍然很短
    秒(1 AR)-1,但仍然生活很短
  • 等待一段时间,等待下一个事件循环,然后触发字符串的自动释放:
    第一(0)杀
    秒(0)杀死
  • 07-26 09:39