Objective-C Вопрос о памяти - PullRequest
       172

Objective-C Вопрос о памяти

1 голос
/ 11 апреля 2010

Это утечка, если у меня есть контроллер вида и я выделю вид так:

self.view = [[UIView alloc] initWithFrame:frame];

Мне нужно сделать что-то вроде этого:

UIView *v = [[UIView alloc] initWithFrame:frame];
self.view = v;
[v release];

Ответы [ 6 ]

3 голосов
/ 11 апреля 2010

Да, второй. Свойства ( self.view ) обычно сохраняют свои значения.

2 голосов
/ 11 апреля 2010

Да, это утечка. Ваше решение верное, или вы можете сделать:

view = [[UIView alloc] initWithFrame:frame];

Где view - это переменная экземпляра. Но это не такая хорошая практика. Как указано ниже, в представлении UIViewController это свойство суперкласса, поэтому мой пример кода вдвойне неверен Однако стоит отметить, что принцип self.variable вызывает setVariable: и будет соблюдать стиль сохранения объявления свойства. В таких случаях вы можете напрямую назначить указанную выше переменную экземпляра, которая пропускает сохранение - и делает такой код ужасным для поддержки, что объясняет, почему свойство синтаксического сахара Apple Objective C 2.0 не вызывает всеобщего восхищения.

Исправлено, потому что Георг был совершенно прав.

1 голос
/ 11 апреля 2010

Вам нужно прочитать Правила управления памятью какао .

Вы получили объект с +alloc.Поэтому, согласно правилам, вы несете ответственность за его освобождение.Ваше собственное решение прекрасно, или вы могли бы сделать:

self.view = [[[UIView alloc] initWithFrame:frame] autorelease];
1 голос
/ 11 апреля 2010

Это зависит от объявления свойства view. Если это не (сохранить) свойство, то все в порядке. Если это сохраняемое свойство, вы должны позвонить release.

0 голосов
/ 15 апреля 2011

В цели c нам нужно сохранить счет объекта равным нулю после его цели. Итак, здесь в вашем коде вы должны освободить объект. Тогда это не создаст никаких проблем с утечкой.

Второй, который вы указали, - правильный путь. Это не обязательно, это способ показать, насколько эффективен наш код.

0 голосов
/ 11 апреля 2010

Существует очень простое правило для управления памятью Objective-C. Если вы отправили сохранить сообщение, вы также должны отправить релиз. Я не знаю исключений с этим правилом является сам SDK.

Здесь мы выделили, что отправка сохраняет себя (всегда), поэтому вы должны куда-то выпустить объект. Вы можете сделать это в dealloc или прямо здесь, после назначения его для self.view.

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