Objective-C:在内存方面,我需要对发布对象的其他指针做些什么?

时间:2010-10-15 04:37:49

标签: objective-c memory-management

例如说我有:

NSMutableArray *array = [[NSMutableArray alloc] init];
NSMutableArray *array2 = array;
[array release];
这是合法的吗?我是否只是因为我已经释放了记忆内容的对象而离开了array2?

4 个答案:

答案 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];

这完全等同于您的代码,同样合法。您可以在arrayarray2上拨打电话,但效果完全相同。呼叫不会更改arrayarray2。只有指向的对象。

所以没有必要保留两次只发布两次。最后,你会得到完全相同的情况:两个指向被释放对象的指针。

如果你愿意,你可以把它们弄掉,但这不是必需的。

答案 3 :(得分:1)

这不只是代码清洁度的问题吗?

如果你想让array2指向数组,并且你将要对array2做一些工作,那么我会明确地保留它:

NSMutableArray *array = [[NSMutableArray alloc] init];
NSMutableArray *array2 = [array retain];
[array release];
[array2 release];

这样,如果在调用[array release]之后其他人决定使用array2做一些工作,它们就不会遇到内存问题。

您的原始代码有效,但在调用发布后使用array2的任何人都会感到非常惊讶。