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



我有这样的代码:

- (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时,它不会被释放,直到数组从第二个数组中移除。

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

最新更新