Objective c 目标C-双重释放导致的碰撞?

Objective c 目标C-双重释放导致的碰撞?,objective-c,memory-management,Objective C,Memory Management,以下代码应该在“手动引用计数”下崩溃,因为数组中的对象将被释放两次。为什么它没有崩溃 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];

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

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];
}
为什么它没有崩溃

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];
}
因为所讨论的对象是,它们的处理方式有所不同。基本上,这样的对象永远不会被释放。请参阅以获取完整的解释

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

[array addObject:[stringWithFormat:@"1"]];

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

有关其他详细信息,请参见添加NSDictionary的相同结果的NSString部分array@aryaxt它是一本
@{“foo”:@bar}
形式的字典吗?换言之,这是一个错误吗?我改变了答案中的措辞,以涵盖所有对象文字,而不仅仅是字符串。没有带KeyAndValues:的NSSidDictionary字典,最后它崩溃了。我现在很高兴。当我用1初始化所有对象时,当我更改崩溃的数字时,您的解决方案不会崩溃。非常奇怪。如果您拥有对象(称为
alloc
retain
copy
,或
mutableCopy
),则只调用
release
)。你不拥有数组中的对象,所以你不能释放它们。@rmaddy我知道,我的问题不是为什么它会崩溃。这就是为什么它没有