Должен ли я освободить это свойство? - PullRequest
2 голосов
/ 04 октября 2009

Я цель c новичком, и у меня возникли некоторые проблемы с управлением памятью, я прочитал политику управления памятью Apple, однако мне нужно немного прояснить здесь, это довольно просто, я думаю, но я хотел бы спросить вас, прав ли я:

Учитывая данное свойство:

@interface Test : NSObject {
  NSArray *property1;
}
@property (nonatomic,retain) NSArray* property1;
@end

...

//And its implementation:
@implementation Test
@synthetize property1;
-(id) init {
  if (self=[super init]) {
    self.property1=[[[NSArray alloc] initWithCapacity:5] autorelease];
  }
  return self;
}
-(void) dealloc {
  [super dealloc];
  [property1 release];
}

@ конец

Правильно ли выдать сообщение Autorelease для выделенного объекта в методе init? Я делаю это в документе Apple, говорит, что каждый выделенный объект должен быть освобожден разработчиком, тогда, я думаю, наборы alloc сохраняют счет к 1, то свойство (неатомное, сохраняемое) добавляет 1, поэтому сохраняйте == 2, затем автоматически высвобождает 1, а когда вызывается метод dealloc, свойство property1 освобождается и сохраняется число == 0, я прав?

Ответы [ 3 ]

6 голосов
/ 04 октября 2009

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

2 голосов
/ 04 октября 2009

примечание с одной стороны: в вашем dealloc вам нужно освободить свойство до , вызывая [super dealloc], потому что [super dealloc] в конечном итоге освобождает память объекта, которая включает в себя память, содержащую property1 переменная, поэтому недопустимо ссылаться на эту переменную после вызова [super dealloc]. Должно быть:

-(void) dealloc {
 [property1 release];
 [super dealloc];
}
0 голосов
/ 04 октября 2009

Одной из приятных особенностей использования свойств является то, что вы можете инкапсулировать все свои «освобождающие» свойства независимо от того, настроено ли ваше свойство для сохранения, копирования, назначения или чего-либо еще, просто выполнив это:

self.property1 = nil;

Лично у меня появилась привычка устанавливать все свойства равными nil (используя self.property, а не просто напрямую обращаться к переменной-члену) в dealloc, так что даже если я изменю работу управления памятью для переменной-члена, она работает правильно.

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