снимаем с просмотра и выпускаем управление памятью - PullRequest
2 голосов
/ 19 января 2012

У меня есть MBProgressHUD, который я выделяю следующим образом:

 self.progressHUD_ = [[[MBProgressHUD alloc] initWithView:self.view] autorelease];

если я вызову removeFromSuperview, придется ли мне снова вызывать releaseHUD release? Также, если я объявлю свойство с чем-то вроде этого:

NSString * title_;

@property (nonatomic, retain) NSString * title_;

тогда гарантированно, что в моем dealloc у меня должен быть релиз на заголовке, верно?

Ответы [ 3 ]

1 голос
/ 01 февраля 2012

Если progressHUD_ является сохраняемым свойством, вам нужно будет разблокировать его в dealloc. Тем не менее, хорошая особенность свойства retain заключается в том, что вам нужно только установить его на nil , чтобы освободить память; убедившись, что использовать «себя». до этого.

e.g.

self.<property_name> = nil;

// or in your case

self.progressHUD_ = nil;

// the following will not release it because it's not accessing the property:

progressHUD_ = nil

Я не рекомендую использовать [progressHUD_ release], потому что это может вызвать проблемы. например если в другом месте вы выпустили progressHUD_ и не установили его в nil, вы можете случайно освободить указатель, который больше не выделяется (висячий указатель).

Я также рекомендую вызывать self.progressHUD_ = nil; в viewDidUnload, который вызывается при нехватке памяти, и представление не отображается. Это не убивает ваш экземпляр класса, а просто выгружает представление. И, конечно, это предполагает, что вы звоните self.progressHUD_ = [[[MBProgressHUD alloc] initWithView:self.view] autorelease]; в viewDidLoad, а не в init...

0 голосов
/ 19 января 2012

Как определяется ваша progressHUD_ собственность? (кстати, у ивара должно быть завершающее подчеркивание, но не имя свойства).

В случае, если оно определено как (retain, whatever), вам придется снова выпустить его:

  1. Когда вы создаете его, его retainCount равен + 1.
  2. Когда вы присваиваете его своей собственности, его retainCount увеличивается на единицу.
  3. Когда вы добавляете его как подпредставление в родительское представление, его retainCount будет увеличен на единицу.
  4. В какой-то момент авторелиз в конечном итоге уменьшит его на 1, но вид и свойство все еще сохраняют его.

Так что вам придется либо установить для своего свойства значение nil, либо вызвать release на иваре в методе dealloc.

Кроме того, вы, вероятно, захотите использовать copy вместо retain при определении свойства NSString. И да: вам придется выпустить его в любом случае.

0 голосов
/ 19 января 2012

Нет, вам не нужно выпускать его снова.Представления сохраняют свои подпредставления и автоматически освобождают их при вызове removeFromSuperview.Пока представление автоматически высвобождается, когда вы присоединяете его к представлению, оно будет освобождено при удалении из представления.

Я не совсем понял ваш второй вопрос, но да, вы должныосвободите любые свойства типа «сохранить» или «скопировать» в вашем операторе dealloc.Вы должны написать эти операторы релиза вручную, они не добавляются автоматически (если, конечно, вы не используете ARC, что я настоятельно рекомендую).

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