Iphone правильный способ установить свойство - PullRequest
0 голосов
/ 12 января 2011

у меня есть следующий код в .h:

@property (nonatomic, retain) NSArray *arrayData;

А в .m в методе initWithNibName:

self.arrayData = [NSArray arrayWithObjects:@"Usuario:",@"Password:",nil];

правильно ли звонить

[self.arrayData release]

безопасно, чтобы освободить объект?

Ответы [ 3 ]

1 голос
/ 12 января 2011

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

Вы можете сделать следующее:

  1. self.arrayData = nil; (который освободит предыдущий сохраненный экземпляр и установит для свойства значение nil)
  2. [arrayData release]; arrayData = nil; (здесь вы получаете доступ к своему ивару вместо своей собственности; установка значения ивара на ноль - это предосторожность)
  3. [self-> arrayData release]; self-> arrayData = nil (это точно так же, как # 2)

Надеюсь, это поможет.

1 голос
/ 12 января 2011

A) это плохая идея сделать это в вашем инициализаторе (например, initWithNibName: bundle:)

self.arrayData = [NSArray arrayWithObjects:@"Usuario:",@"Password:",nil];

использовать это вместо:

arrayData = [[NSArray alloc] initWithObjects:@"Usuario:",@"Password:",nil];

вы не должны вызыватьэти методы доступа (свойства) в инициализаторах или dealloc.

B)

правильно ли вызывать

[выпуск self.arrayData]

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

это типично:

self.arrayData = nil;

, если Вы находитесь в dealloc объекта, который объявил ивар:

- (void)dealloc {
  [arrayData release], arrayData = nil;
  [super dealloc];
}
1 голос
/ 12 января 2011

Вам нужно позвонить:

[arrayData release]

Вызов [выпуск self.arrayData];не даст желаемого эффекта в любом случае.

Если вам интересно, почему это так, проверьте этот вопрос: разница между [self.property release] и [property release]

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