例如说我有:
NSMutableArray *array = [[NSMutableArray alloc] init];
NSMutableArray *array2 = array;
[array release];
这是合法的吗?我是否只是因为我已经释放了记忆内容的对象而离开了array2?
答案 0 :(得分:2)
如您所料,在您致电[array release]
后,array2不再引用有效对象。
然而,目前尚不清楚第二个变量的值是多少。在array
尚未提供(它们具有相同的范围)的任何地方都无法使用它,并且由于它们都引用同一个对象,因此您可能只使用一个变量。
如果您需要第二个数组或在[array release]
之后有效的其他引用,则可以创建副本,或使用NSMutableArray *array2 = [array retain]
。无论哪种方式,您都需要在某个时刻释放array2以避免内存泄漏。
答案 1 :(得分:1)
变量数组和array2只是指向一块内存的C指针。与C中任何堆分配的内存块一样,它必须是malloced()和freed(),这有效地确定了在没有垃圾收集器的情况下内存块的生存期。 Obj-C对象是一些专门的内存块,但底层的机制是相同的:calloc()和free()的变体。
所以是的,在发送[数组释放]后,数组对象的保留计数达到零,对象立即将-dealloc发送给self,调用free()。之后,任何访问对象占用的内存块的尝试都会导致崩溃(或者更糟糕的是,如果在同一地址分配了另一个Obj-C对象,则会在代码中的不相关位置发生崩溃)。 / p>
因为array2只是另一个指向同一个,现在被释放的内存块的指针,所以你也无法做任何事情。你可以做的最好的事情是将这些指针设置为nil,以防止你自己意外地访问你不再拥有的内存。 Obj-C足够聪明,可以将消息发送到nil(发送给nil指针的消息)no-ops。
答案 2 :(得分:1)
你没有做任何事情!
“其他”指针与原始指针没有区别。他们都指向同一件事。它们完全相同。
要理解的是release
对指针本身没有影响。我得到你认为[array release]
以某种方式对array
指针做某事的印象,让它以某种方式改变了。它没有。请考虑以下代码:
NSMutableArray *array = [[NSMutableArray alloc] init];
NSMutableArray *array2 = array;
[array2 release];
这完全等同于您的代码,同样合法。您可以在array
或array2
上拨打电话,但效果完全相同。呼叫不会更改array
或array2
。只有指向的对象。
所以没有必要保留两次只发布两次。最后,你会得到完全相同的情况:两个指向被释放对象的指针。
如果你愿意,你可以把它们弄掉,但这不是必需的。
答案 3 :(得分:1)
这不只是代码清洁度的问题吗?
如果你想让array2指向数组,并且你将要对array2做一些工作,那么我会明确地保留它:
NSMutableArray *array = [[NSMutableArray alloc] init];
NSMutableArray *array2 = [array retain];
[array release];
[array2 release];
这样,如果在调用[array release]之后其他人决定使用array2做一些工作,它们就不会遇到内存问题。
您的原始代码有效,但在调用发布后使用array2的任何人都会感到非常惊讶。