我有这段代码:
- (void) firstMethod{
NSString *first = @"Hello";
NSString *second = @"World";
NSArray *myFirstArray = [[NSArray alloc] initWithObjects: first, second, nil];
[mySecondArray addObject :myFirstArray];
[myFirstArray release];
}
当我释放myFirstArray时,我可以丢失两个字符串吗?或者它们仍保存在mySecondArray中?
答案 0 :(得分:3)
创建对象时,第一个和第二个的保留计数为1(自动释放) 添加到数组的每个对象都会保留计数。
因此,当将first和second添加到firstArray时,它们的保留计数会增加到2(使用1自动释放)。 将firstArray中的这些对象添加到secondArray时,firstArray没有任何反应,但是firstArray中的第一个和第二个被发现并再次添加到secondArray中,因此它们的保留计数再次被提升到3(包括1个自动释放)。
如果你释放第一个数组,它自己的保留计数会减少,而它“包含”的每个对象的保留计数也会减少。因此,数组的保留计数为0,并从内存中删除。第一个和第二个的保留计数减少到2(包括1个自动释放)。
如果等待一段时间,会触发自动释放效果,并且第一个和第二个的保留计数减少1,因此它们的保留计数为1,即从firstArray添加第一个和第二个时设置的保留计数secondArray。
只是在内存中保留数组不包含任何对象,但引用(如果您愿意,也可以使用指针)指向数组外部的对象。
如果你写:
NSArray *myFirstArray = [[NSArray alloc] initWithObjects: @"test1", nil];
它创建一个字符串对象,将test1放入其中,将其保留计数设置为1,并使其自动释放。然后将对象的内存地址插入到数组中,并将其自己的保留计数设置为1.
另一方面,myFirstArray是一个指针数组的指针,每个对象都有自己的保留计数。
编辑:给出的解释是addObjectsFromArray:
我再次阅读了这个问题,我发现问题是针对addObject:
所以recipe是相同的。假设保留计数在括号中,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数组]创建的;缺少的)
呼叫保留的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)KILL
然后myFirstArray收到发布版 myFirstArray(0)KILL
然后每个对象进入myFirstArray会收到一个释放
第一(1 AR)-1,但仍然生活在短时间内
秒(1 AR)-1,但仍然生活很短时间
等待一段时间进行下一个事件循环,然后触发字符串的自动释放:
第一次(0)KILL
秒(0)KILL
答案 1 :(得分:1)
它们不是由第二个数组存储的,但第一个数组将由第二个数组保留。
意思是,当你在第一个数组上调用release时,在从第二个数组中删除数组之前它不会被释放。
第二个数组保留第一个数组。 第一个数组保留字符串。