将对象设置为nil与release + realloc

时间:2009-03-09 16:03:52

标签: iphone objective-c ios cocoa-touch cocoa

这不是垃圾收集环境

我有一个类实例变量,在运行时的某个时刻,我需要使用与最初构造时不同的数据集重新初始化。

假设,如果我有NSMutableArrayNSMutableDictionary,如果做以下事情会更有效:

[myArr release];
myArr  = [[NSMutableArray alloc] init....];

或只是,

myArr = nil;

myArr是否会释放该对象并让我没有指向内存中的存储器的指针,以便重新使用myArr?

6 个答案:

答案 0 :(得分:21)

如果您单独执行myArr=nil;,那么您已经丢失了可以将release消息发送到的指针。 release你的对象没有魔力。

而且,正如格奥尔格所说,无法释放你的物体,那个记忆已经“泄露”。

答案 1 :(得分:6)

您可以使用属性并获得所需的语法而不会造成内存泄漏。

使用此语法声明数组

@property (readwrite, retain) NSMutableArray *myArray;

然后重新初始化它:

[self setMyArray:[NSMutableArray array]];

答案 2 :(得分:5)

如果你使用的是Mac OS,而不是iPhone OS,我会说它取决于垃圾收集器是否被激活:

  • 使用GC:使用myArr = nil;
  • 不使用GC:使用[myArr release];

不幸的是,在iPhone上,没有垃圾收集,所以如果你不想要内存泄漏,你必须在不再需要时释放你的对象。

答案 3 :(得分:4)

第一个代码块很好。但是,第二个块不会为您提供可以使用的阵列,因此这还不够。一半纠正那块,我想你的意思是:

myArr = nil;
myArr = [[NSMutableArray alloc] init....];

但是,由于您没有发布myArr,因此无法实现您的目标。如果你为myArr合成了一个setter,那么你可以通过使用setter(self.myArr)而不是直接访问指针(myArr)来获得你想要的设置为nil的释放行为。完全纠正你的第二个街区:

self.myArr = nil;
myArr = [[NSMutableArray alloc] init....];

现在我们有相同的代码示例,一个使用setter,nil释放,另一个不使用。他们是一样的。

如果myArr是这些示例中的可变数组,那么最有效的方法是使用removeAllObjects,避免释放内存的所有工作只是为了声明它:

[myArr removeAllObjects];

答案 4 :(得分:1)

实现差异的一种方法可能是:将对象的引用设置为nil对对象没有任何作用,它只对引用做了一些事情。

“释放对象”不是“没有”,所以它不会这样做。 :)在垃圾收集语言中,它可能会作为删除引用的副作用,但在Objective C中它不会那样工作。

答案 5 :(得分:1)

如果你想要的是重置NSMutableArray / NSMutableDictionary的内容,你也可以调用removeAllObjects,你有一个新的数组/字典可以使用。