目标 C - 由于双重释放而崩溃?

ary*_*axt 2 memory-management objective-c

以下代码应该在“手动引用计数”下崩溃,因为数组内的对象被释放两次。为什么它不会崩溃?

NSMutableArray *array = [NSMutableArray array];
[array addObject:@"1"];
[array addObject:@"2"];
[array addObject:@"3"];


for (int i=array.count-1 ; i>= 0 ; i--)
{
    id object = [array objectAtIndex:i];
    [object release];
    [array removeObject:object];
}
Run Code Online (Sandbox Code Playgroud)

Cal*_*leb 5

为什么它不会崩溃?

因为所讨论的对象是对象文字,它们的处理方式有些不同。基本上,此类对象永远不会被释放。有关完整说明,请参阅Objective C NSString* 属性保留计数奇数

如果您像这样更改第二行:

[array addObject:[stringWithFormat:@"1"]];
Run Code Online (Sandbox Code Playgroud)

您应该会看到您期望的崩溃,因为数组中的第一项不是字符串常量,而是受通常引用计数规则约束的常规旧动态分配字符串。