Распределение IBOutlets и экземпляров Vars - PullRequest
1 голос
/ 05 октября 2011

Это то, что я должен был прояснить давно, но мне просто нужно знать лучшие практики для освобождения средств в следующем сценарии.

В моем заголовочном файле я объявляю ссылку на IBOutlet какследующим образом:

@interface Test : UIViewController {
    UIButton *_loginBtn;
}

@property (nonatomic, retain) IBOutlet UIButton *loginBtn;

И в файле реализации я связываю переменную экземпляра со свойством и освобождаю следующим образом:

@implementation Test

@synthesize loginBtn = _loginBtn;

...

- (void) dealloc {
    [_loginBtn release];
    self.loginBtn = nil;

    [super dealloc];
}

- (void) viewDidUnLoad {
    [_loginBtn release];
    self.loginBtn = nil;

    [super viewDidUnLoad];
}

Прав ли я в освобождении переменной экземпляра и установкесвойство nil и делать это в методах viewDidUnLoad и dealloc?

Ответы [ 2 ]

2 голосов
/ 05 октября 2011

Нет необходимости в self.loginBtn = nil; в dealloc, предыдущая строка выпустила его.Лучше не использовать свойство, чтобы освободить его в dealloc.Причина освобождения vs установки свойства в nil состоит в том, что setter является вызовом метода, а класс находится в процессе разрушения, и вещи могут быть нестабильными.1006 * с self.theOutlet = nil;, в этом случае _loginBtn release]; не требуется и является избыточным.Также освободите любые другие объекты, которые вы можете легко воссоздать.

Если используются свойства, они должны использоваться для всех обращений в классе с двумя исключениями: init и dealloc.В обоих этих случаях класс частично завершен.В этих двух случаях лучше всего использовать ивар непосредственно в init (при необходимости) и release в dealloc.

1 голос
/ 05 октября 2011

Нет, это неправильно.Сначала выпуская _loginBtn, а затем устанавливая свойство равным nil, вы освобождаете экземпляр дважды.Правильный способ сделать это - освободить _loginBtn, а затем установить для _loginBtn значение nil.

...