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

Dan*_*Ray 2 iphone memory-management objective-c

在我的根视图控制器中,在我的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;
Run Code Online (Sandbox Code Playgroud)

今天我在想......虽然我并不确定当我这样做时,所有分配的内存真的被释放了.我应该代替release这些图片,也许打他们一个新的allocinit当我再次需要他们以后呢?

Noa*_*oon 5

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