这不是垃圾收集环境
我有一个类实例变量,在运行时的某个时刻,我需要使用与最初构造时不同的数据集重新初始化。
假设,如果我有NSMutableArray
或NSMutableDictionary
,如果做以下事情会更有效:
[myArr release];
myArr = [[NSMutableArray alloc] init....];
或只是,
myArr = nil;
myArr是否会释放该对象并让我没有指向内存中的存储器的指针,以便重新使用myArr?
答案 0 :(得分:21)
如果您单独执行myArr=nil;
,那么您已经丢失了可以将release
消息发送到的指针。 release
你的对象没有魔力。
而且,正如格奥尔格所说,无法释放你的物体,那个记忆已经“泄露”。
答案 1 :(得分:6)
您可以使用属性并获得所需的语法而不会造成内存泄漏。
使用此语法声明数组
@property (readwrite, retain) NSMutableArray *myArray;
然后重新初始化它:
[self setMyArray:[NSMutableArray array]];
答案 2 :(得分:5)
如果你使用的是Mac OS,而不是iPhone OS,我会说它取决于垃圾收集器是否被激活:
myArr = nil;
[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,你有一个新的数组/字典可以使用。