Objective c 目标C:内存方面,我需要如何处理指向已发布对象的其他指针?

Objective c 目标C:内存方面,我需要如何处理指向已发布对象的其他指针?,objective-c,memory-management,Objective C,Memory Management,例如,我有: NSMutableArray *array = [[NSMutableArray alloc] init]; NSMutableArray *array2 = array; [array release]; 这合法吗?因为我已经释放了占用内存的对象,所以我会让array2悬而未决吗 正如您所怀疑的,在调用[array release]之后,array2不再引用有效对象 然而,不清楚第二个变量的值是什么。数组不可用的任何地方都不能使用,因为它们具有相同的作用域,而且由于它们都引用同

例如,我有:

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

这合法吗?因为我已经释放了占用内存的对象,所以我会让array2悬而未决吗

正如您所怀疑的,在调用[array release]之后,array2不再引用有效对象

然而,不清楚第二个变量的值是什么。数组不可用的任何地方都不能使用,因为它们具有相同的作用域,而且由于它们都引用同一个对象,所以最好只使用一个变量


如果您需要第二个数组,或在[array release]之后有效的另一个引用,则可以创建一个副本,或使用NSMutableArray*array2=[array retain]。无论哪种方式,您都需要在某个时候释放array2以避免内存泄漏。

正如您所怀疑的,在调用[array release]之后,array2不再引用有效对象

然而,不清楚第二个变量的值是什么。数组不可用的任何地方都不能使用,因为它们具有相同的作用域,而且由于它们都引用同一个对象,所以最好只使用一个变量


如果您需要第二个数组,或在[array release]之后有效的另一个引用,则可以创建一个副本,或使用NSMutableArray*array2=[array retain]。无论哪种方式,您都需要在某个时刻释放array2以避免内存泄漏。

变量数组和array2只是指向内存块的C指针。与C中任何堆分配的内存块一样,它必须被malloced和freed,这在没有垃圾收集器的情况下有效地决定了内存块的生存期。Obj-C对象是一些专门的内存块,但其基本机制是相同的:calloc和free的变体

因此,是的,在发送[array release]之后,数组对象的保留计数达到零,对象立即向self发送-dealoc,这将调用free。在此之后,任何试图访问该对象占用的内存块的尝试都将导致崩溃或更糟的情况,如果在同一地址分配另一个Obj-C对象,那么代码中所有不相关的地方都会发生崩溃


因为array2只是指向相同的、现在已释放的内存块的另一个指针,所以您也不能对它做任何事情。您所能做的最好的事情就是将这些指针设置为nil,以防止自己意外访问不再拥有的内存。Obj-C足够智能,可以将消息发送到nil,将消息发送到nil指针,而无需操作

变量array和array2只是指向内存块的C指针。与C中任何堆分配的内存块一样,它必须被malloced和freed,这在没有垃圾收集器的情况下有效地决定了内存块的生存期。Obj-C对象是一些专门的内存块,但其基本机制是相同的:calloc和free的变体

因此,是的,在发送[array release]之后,数组对象的保留计数达到零,对象立即向self发送-dealoc,这将调用free。在此之后,任何试图访问该对象占用的内存块的尝试都将导致崩溃或更糟的情况,如果在同一地址分配另一个Obj-C对象,那么代码中所有不相关的地方都会发生崩溃

因为array2只是指向相同的、现在已释放的内存块的另一个指针,所以您也不能对它做任何事情。您所能做的最好的事情就是将这些指针设置为nil,以防止自己意外访问不再拥有的内存。Obj-C足够智能,可以将消息发送到nil,将消息发送到nil指针,而无需操作

你什么都不用做

“其他”指针与原始指针没有区别。他们都指向同一件事。它们完全相等

需要理解的是,释放对指针本身没有影响。我得到的印象是,您认为[array release]对数组指针做了某种改变,使其发生了某种改变。没有。考虑这个代码:

NSMutableArray *array = [[NSMutableArray alloc] init];
NSMutableArray *array2 = array;
[array2 release];
这完全等同于您的代码,并且是合法的。您可以在array或array2上调用release,它具有完全相同的效果。调用不会更改数组或数组2。只有物体指向

因此,没有必要保留两次而只释放两次。最后,您将面临完全相同的情况:两个指向已释放对象的指针

如果你想的话,你可以将它们置零,但这不是必须的。

你什么都不用做

“其他”指针与原始指针没有区别。他们都指向同一件事。它们完全相等

需要理解的是,释放对指针本身没有影响。我得到的印象是,您认为[array release]对数组指针做了某种改变,使其发生了某种改变。没有。考虑这个代码:

NSMutableArray *array = [[NSMutableArray alloc] init];
NSMutableArray *array2 = array;
[array2 release];
这正是 等同于您的代码,同样合法。您可以在array或array2上调用release,它具有完全相同的效果。调用不会更改数组或数组2。只有物体指向

因此,没有必要保留两次而只释放两次。最后,您将面临完全相同的情况:两个指向已释放对象的指针


如果愿意,您可以将它们置零,但这不是必需的。

这不仅仅是代码清洁的问题吗

如果您想让array2指向array,并且要使用array2进行一些工作,那么我将明确保留它:

NSMutableArray *array = [[NSMutableArray alloc] init];
NSMutableArray *array2 = [array retain];
[array release];
[array2 release];
这样,如果其他人在调用[array release]后决定使用array2,他们就不会遇到内存问题


您的原始代码是有效的,但在发布后使用array2的任何人都会大吃一惊。

这不仅仅是代码清洁的问题吗

如果您想让array2指向array,并且要使用array2进行一些工作,那么我将明确保留它:

NSMutableArray *array = [[NSMutableArray alloc] init];
NSMutableArray *array2 = [array retain];
[array release];
[array2 release];
这样,如果其他人在调用[array release]后决定使用array2,他们就不会遇到内存问题



您的原始代码是有效的,但在调用release后,对于任何使用array2的人来说,都会有一个令人不快的惊喜。

在回答中,请不要质疑代码的逻辑。说来话长。基本上,我只需要另一个对“数组”的引用。在回答中,请不要质疑代码的逻辑。说来话长。基本上我只需要另一个对“array”的引用。NSMutableArray*array=[[NSMutableArray alloc]init];NSMUTABLEARRY*array2=[array retain];[阵列释放];[array2发布]。。。。这个看起来对吗?我觉得很对,但我很难在不换行的情况下阅读代码。@Schnitzel:是的,它是对的@机器人K:保留数组并不意味着复制。是的,array2不再引用有效对象,但数组也不引用,那么有什么区别呢?@Jeremy-我不是想暗示retain复制了一个对象。我说过你可以复制或者保留它;NSMUTABLEARRY*array2=[array retain];[阵列释放];[array2发布]。。。。这个看起来对吗?我觉得很对,但我很难在不换行的情况下阅读代码。@Schnitzel:是的,它是对的@机器人K:保留数组并不意味着复制。是的,array2不再引用有效对象,但数组也不引用,那么有什么区别呢?@Jeremy-我不是想暗示retain复制了一个对象。我说过可以复制或保留它。是的,我正在考虑将array2设置为零,因为在array发布后我不会使用array2。但是我有点喜欢机器人K增加保留计数的想法。。。然后释放两个。与保留计数一起工作有点漂亮。。否?如果将array2设置为nil,则也应将array设置为nil。将其中一个置零而不将另一个置零是没有意义的。是的,我正在考虑将array2设置为零,因为在array发布后我不会使用array2。但是我有点喜欢机器人K增加保留计数的想法。。。然后释放两个。与保留计数一起工作有点漂亮。。否?如果将array2设置为nil,则也应将array设置为nil。没有一个而没有另一个是没有意义的。我也试图说明这一点,但你说得更清楚了。是的,你是对的。。。但我只是感到不安;,我认为从长远来看,使用保留计数更“安全”。+1。我也试图说明这一点,但你说得更清楚了。是的,你是对的。。。但我只是感到不安;,我认为从长远来看,使用保留计数“更安全”。这是Robot K最初的建议,但我将标记您作为答案,因为您编写了代码。这就是我决定采用的方法,似乎是最合适的方法。这是Robot K最初的建议,但我将标记您作为答案,因为您编写了代码。这就是我决定要做的,而且似乎是最合适的方式。