设置对象零与释放+ realloc

这不是垃圾收集的环境

我有一个类实例variables,在我的运行时,我需要重新初始化一个不同的数据集,而不是最初的构造。

假设说,如果我有一个NSMutableArray或一个NSMutableDictionary ,如果做一些事情会更有效率:

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

要不就,

 myArr = nil; 

myArr会释放这个对象,并且让我没有指向内存中的存储的指针,所以我可以重新使用myArr?

如果你做myArr=nil; 那么你已经失去了可以发送release信息的指针了。 没有魔法release你的对象。

而且,正如乔治所说,不能释放你的对象,这个记忆已经“泄漏”了。

你可以使用一个属性,并获得几乎所需的语法,而不会泄漏内存。

使用这个语法来声明数组

 @property (readwrite, retain) NSMutableArray *myArray; 

然后像这样重新初始化它:

 [self setMyArray:[NSMutableArray array]]; 

如果你在Mac OS上,而不是iPhone OS,我会说这取决于垃圾收集器是否被激活:

  • 与GC:使用myArr = nil;
  • 没有GC:使用[myArr release];

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

第一个代码块很好。 但是,第二个块不会给你一个你可以使用的数组,所以这是不够的。 一半纠正这个块,我想你的意思是:

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

然而,这并没有达到你想要的,因为你不释放myArr。 如果已经为myArr合成了一个setter,那么通过使用setter(self.myArr)而不是直接访问指针(myArr),您可以获得想要设置为nil的释放行为。 完全纠正你的第二块:

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

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

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

 [myArr removeAllObjects]; 

一种方法来实现差异可能是这样的:将对象的引用设置为零对对象不做任何事情,它只对引用做一些事情。

“释放对象”不是“无”,所以不这样做。 :)在垃圾收集的语言中,它可能会将其作为删除引用的一个副作用,但是在Objective C中,它不会以这种方式工作。

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