Вызывает ли этот код target-c утечку памяти? - PullRequest
2 голосов
/ 05 февраля 2011

Сравните следующие 2 фрагмента:

образец 1:

[[UIApplication shareApplication] openURL: [NSURL URLWithString:@"http://stackoverflow.com"]]

и образец 2:

NSURL *url = [[NSUrl URLWithString:@"http://stackoverflow.com"];
[[UIApplication shareApplication] openURL: url];
[url release];

Образец 1 вызывает утечку памяти? [url release] в образце 2 избыточен?

Если утечка памяти случается, насколько она плоха?

Ответы [ 3 ]

9 голосов
/ 05 февраля 2011

Образец 1 не вызывает утечку памяти и является общим способом сделать это. Объект NSURL автоматически освобожден, и поэтому вы не должны выпускать его самостоятельно (как в примере 2).

2 голосов
/ 06 февраля 2011

Образец 1 прекрасно, как уже было описано выше. Однако образец 2 на самом деле должен привести к сбою. -URLWithString: автоматически высвобожден, поэтому его количество сохранений будет фактически равным нулю при сливе следующего пула автоматического выпуска. Явное освобождение его так же, как вы делаете, немедленно приведет к тому, что счет удержания станет равным 0, что приведет к освобождению. Затем, когда пул автозапуска слит, он попытается снова освободить эту строку, что приведет к сбою.

Всегда лучше использовать команду Build and Analyze в Xcode. Он может обнаружить и предупредить вас почти обо всех проблемах утечки памяти, хотя и не идеален. Тем не менее, это хорошая практика.

0 голосов
/ 05 февраля 2011

@ BoltClock, я думаю, вы не совсем правы, когда говорите, что объект автоматически выпущен в образце 1.

В примере 2 переменной с именем url присваивается объект, возвращаемый методом [NSUrl URLWithString:], что увеличивает его счетчик хранения на 1. Чтобы сбалансировать это, нам нужно release. В примере 1 ссылка на объект напрямую передается получателю, и нам не о чем беспокоиться по поводу его счетчика хранения, следовательно, нет выпуска.

Обратите внимание, что мы не выпускаем автоматически, так как мы ничего не сохранили в первую очередь. «В коде, который автоматически высвобождается, нет переменной!»

Пожалуйста, поправьте меня, если я где-то концептуально ошибаюсь. И просто, чтобы завершить это, нет утечки ни в одном из образцов, и оба являются правильными способами сделать это.

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