какая разница между двумя сценариями кода - PullRequest
1 голос
/ 04 августа 2011

Scenario1:

NSDictionary *dictionary =
              [[NSDictionary alloc] initWithContentsOfFile:plistPath];
self.stateZips = dictionary;
[dictionary release];

Scenario2:

self.stateZips = [[NSDictionary alloc] initWithContentsOfFile:plistPath];

Ответы [ 3 ]

4 голосов
/ 04 августа 2011

зависит от stateZips свойства.
Если это retained:
Сценарий 1: stateZips правильно сохранен (релиз на stateZips вызовет его освобождение). также местный словарь выпущен тут же.
Сценарий 2: stateZips сохраняется дважды (релиз в stateZips не будет вызывать его освобождение, поскольку он все еще сохраняется).

Если это assigned:
Сценарий 1: stateZips указывает на освобожденный словарь и доступ к нему в другом месте, где может произойти сбой.
Сценарий 2: stateZips правильно сохранен (выпуск stateZips вызовет его освобождение).

copy не рассматривается, так как я считаю, что это не ваше намерение (по крайней мере, в этом фрагменте кода)

1 голос
/ 04 августа 2011

И то и другое self.stateZips устанавливается в словарь, инициализированный файлом, на который указывает plistPath.

Но во втором указатель на инициализированный словарь не был сохранен, и, поскольку это объект с счетом сохранения +1, технически необходимо отправить ему сообщение release в каком-то месте, чтобы сбалансировать память управление. Но так как нет способа получить указатель на этот объект, вы получите утечку памяти.

Применяются два исключения:

1.Сбор мусора
Если вы находитесь в среде сбора мусора, оба одинаковы. Ну, они не одинаковы, но результат похож.

2. Тип недвижимости
Если установщик для stateZips просто назначает указатель, то вы можете освободить объект, используя указатель ivar. Тогда эти два фрагмента кода имеют только одно различие: в первом объект освобождается сразу после его использования. В последнем случае это просто «не определено». Без контекста трудно определить, был ли этот объект выпущен или нет, и когда.

0 голосов
/ 04 августа 2011

Я предполагаю, что stateZips - это свойство с атрибутом сохранения.

В Сценарии 1. Словарь создается с счетом сохранения 1 в первой строке.Во второй строке свойство снова вызывает retain, увеличивая счетчик сохранения до 2. Наконец, счетчик сохранения уменьшается при выпуске.Это оставит словарь с правильным счетом сохранения.

В Сценарии 2 сохранение вызывается только один раз.

Чистый эффект двух сценариев одинаков.Объект словаря будет сохранен, и вам нужно будет включить выпуск в метод dealloc класса.

Если бы это не было корректно обработано компилятором, то после сохранения / выпуска было бы очень сложноправила объектива-ц.

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