在我的根视图控制器中,在我的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}}点击它们吗?
答案 0 :(得分:5)
如mipadi所说,直接设置实例变量不会释放它所引用的对象。但是你在这里做的是不同的:你正在设置对象属性的值。根据声明属性的方式,可能确实释放它所引用的值。声明为retain
或copy
而不是assign
的属性会获得一个合成的访问器方法(setImage:
语法转换为的.image =
方法)设置新值时的旧值。因此,在这种情况下,如果您的WondrMark
属性声明为retain
,则通过属性将其设置为nil会自动释放旧图像。如果是assign
,则需要在将属性设置为nil之前释放图像。
答案 1 :(得分:0)
将对象设置为nil
时,对象不会被释放,所以是的,你应该释放它们。
答案 2 :(得分:0)
您不应该直接释放其他对象的实例变量或属性。这些对象自己负责这样做。
但是,如果can对象在设置新实例时释放其实例变量(例如使用retain
属性),则将实例变量设置为nil将导致该对象释放旧值。