【问题标题】:release vs setting-to-nil to free memory释放与设置为零以释放内存
【发布时间】:2010-06-02 18:12:09
【问题描述】:

在我的根视图控制器中,在我的 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 这些图像,并在以后再次需要它们时用新的 allocinit 击中它们?

【问题讨论】:

    标签: objective-c iphone memory-management


    【解决方案1】:

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

    【讨论】:

    • 杀手。事实证明,我幸运地找到了正确的解决方案。谢谢!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-10-08
        • 1970-01-01
        • 2011-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-19
        • 2011-11-09
        相关资源
        最近更新 更多