一个变量可以在释放后第二次使用吗?

时间:2010-04-11 13:59:47

标签: iphone memory-management

我尝试了解ObjectiveC中的内存管理,但仍然有些事情对我来说是一种痛苦。 我有一个实例变量:

    NSMutableArray *postResultsArray;

在UI中单击按钮时,我创建了新数组:

self.postResultsArray = [NSMutableArray array];

然后我将一些对象添加到数组中,当整个操作完成后,我想释放数组:

[self.postResultsArray release];

(我假设数组中存储的所有对象都将与数组一起释放)。 当我再次单击该按钮并在代码中我想再次创建数组时出现问题:

self.postResultsArray = [NSMutableArray array];

我明白了:

  

[CFArray release]:发送到解除分配的实例0x3d9e390的消息

我不能第二次初始化相同的实例变量吗?或者我不应该发布它?如果是这样,为什么?

谢谢!

4 个答案:

答案 0 :(得分:2)

不要这样:

[self.postResultsArray release];

执行此操作时,仍会将ivar分配给旧阵列的内存地址。如果要释放阵列,有两种安全的方法:

[postResultsArray release];
postResultsArray = nil;

或者

self.postResultsArray = nil;

发生的事情是设置postResultsArray的代码看起来像这样(意译不准确):

-(void)setPostResultsArray:(NSMutableArray *)newArray {
    [array retain];
    [postResultsArray release]; // this is what's causing the the deallocation message in your log
    postResultsArray = array;
}

答案 1 :(得分:1)

您不应手动释放通过属性访问的对象。而不是

[self.postResultsArray release];

DO

self.postResultsArray = nil;

一切都会好的。 setter将释放旧数组,然后将nil分配给指针。现在发生的事情是,当你为属性分配一个新数组时,setter试图释放旧数组,但你已经释放了那个数组,因此错误。

答案 2 :(得分:0)

不要执行[self.postResultsArray release];,执行self.postResultsArray = nil,这与属性的实现有关。它们将自动释放当前存储的任何内容并保留新值。

答案 3 :(得分:0)

如果您使用其中一条“init”消息创建对象,或者明确要求自己保留,则只需要调用release。因为你不需要调用release,因为创建数组的代码将处理释放 - 最有可能是使用autorelease。