iOS - 关于内存管理的问题:NSArray案例

时间:2011-07-27 13:54:47

标签: ios xcode nsarray

我有这段代码:

- (void) firstMethod{
NSString *first = @"Hello";
NSString *second = @"World";
NSArray *myFirstArray = [[NSArray alloc] initWithObjects: first, second, nil];
[mySecondArray addObject :myFirstArray];
[myFirstArray release];
}

当我释放myFirstArray时,我可以丢失两个字符串吗?或者它们仍保存在mySecondArray中?

2 个答案:

答案 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时,在从第二个数组中删除数组之前它不会被释放。

第二个数组保留第一个数组。 第一个数组保留字符串。