отпустите против установки на ноль, чтобы освободить память - PullRequest
2 голосов
/ 02 июня 2010

В моем корневом контроллере представления, в моем методе didReceiveMemoryWarning, я прохожу пару структур данных (которые я храню в глобальном синглтоне под названием DataManager) и угробляю самые тяжелые вещи, которые у меня есть - одно или, может быть, два изображения, связанные возможно двадцать или тридцать или более записей данных.

Прямо сейчас я прохожу и устанавливаю их на ноль. Я также устанавливаю себе логический флаг, чтобы различные контроллеры представления, которым нужны эти данные, могли легко знать, чтобы перезагрузить. Thusly:

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, когда они понадобятся мне позже?

Ответы [ 3 ]

5 голосов
/ 02 июня 2010

Установка переменной экземпляра напрямую, как говорит mipadi, не освобождает объект, к которому она относится. Однако то, что вы делаете здесь, отличается: вы устанавливаете значение свойства объекта. В зависимости от того, как объявлено это свойство, оно может действительно освобождать значение, на которое оно ссылается. Свойство, объявленное retain или copy, а не assign, получает синтезированный метод доступа (метод setImage:, в который преобразуется синтаксис .image =), который освобождает свое старое значение при установке нового. Таким образом, в этом случае, если свойство вашего WondrMark объявлено как retain, установка его в nil - через свойство - автоматически освобождает старое изображение. Если это assign, вам нужно освободить изображение перед установкой свойства в ноль.

0 голосов
/ 02 июня 2010

Вы не должны напрямую освобождать переменные или свойства экземпляра других объектов. Эти объекты сами ответственны за это.

Однако, если объект can освобождает свои переменные экземпляра при установке новой (например, с retain свойствами), то установка переменной экземпляра в nil приведет к тому, что объект освободит старое значение.

0 голосов
/ 02 июня 2010

Объекты не освобождаются, когда вы устанавливаете их на nil, так что да, вы должны освободить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...