释放vs设置为零以释放内存

时间:2010-06-02 18:12:09

标签: objective-c iphone memory-management

在我的根视图控制器中,在我的didReceiveMemoryWarning方法中,我经历了几个数据结构(我保存在一个名为DataManager的全局单例中),并抛弃了我所拥有的最重的东西 - 一个或两个相关的图像可能有二十或三十个或更多的数据记录。

现在我正在经历并将这些设置为零。我也在为自己设置一个布尔标志,以便需要这些数据的各种视图控制器可以轻松地重新加载。正是如此:

DataManager *data = [DataManager sharedDataManager];
for (Event *event in data.eventList) {
    event.image = nil;
    event.thumbnail = nil;
}

for (WondrMark *mark in data.wondrMarks) {
    mark.image = nil;
}

[DataManager sharedDataManager].cleanedMemory = YES;

今天我在考虑,但是我并不确定当我这样做时,所有分配的内存都被释放了。我应该release代替alloc这些图片,并且可能会在以后再次需要时使用新的init和{{1}}点击它们吗?

3 个答案:

答案 0 :(得分:5)

如mip​​adi所说,直接设置实例变量不会释放它所引用的对象。但是你在这里做的是不同的:你正在设置对象属性的值。根据声明属性的方式,可能确实释放它所引用的值。声明为retaincopy而不是assign的属性会获得一个合成的访问器方法(setImage:语法转换为的.image =方法)设置新值时的旧值。因此,在这种情况下,如果您的WondrMark属性声明为retain,则通过属性将其设置为nil会自动释放旧图像。如果是assign,则需要在将属性设置为nil之前释放图像。

答案 1 :(得分:0)

将对象设置为nil时,对象不会被释放,所以是的,你应该释放它们。

答案 2 :(得分:0)

您不应该直接释放其他对象的实例变量或属性。这些对象自己负责这样做。

但是,如果can对象在设置新实例时释放其实例变量(例如使用retain属性),则将实例变量设置为nil将导致该对象释放旧值。