Цель-C: Является ли инициализация с автоматическим выпуском последующей ошибкой сохранения в конструкторе? - PullRequest
0 голосов
/ 16 сентября 2009

В моем @interface есть NSArray *Monate, за которым следует:

@property (nonatomic, retain) NSArray* Monate;

Если я сделаю:

filePath = [[NSBundle mainBundle] pathForResource:@"SomeFile" ofType:@"plist"];
self.Monate = [NSArray  arrayWithContentsOfFile:filePath];

в конструкторе, он устанавливается как объект с автоматическим освобождением (это правильно?). Так я должен сделать [Monate retain] потом?

Ответы [ 3 ]

4 голосов
/ 16 сентября 2009

Этот код правильный; Вы не должны добавлять удерживающий вызов.

+[NSArray arrayWithContentsOfFile:] вернет автоматически освобожденный NSArray. Передав это -[YourClass setMonate:], вы сохраните объект и присвойте вспомогательному ивару. После того, как конструктор вернется, новый NSArray будет иметь счет сохранения 2 и будет добавлен один раз в текущий пул автоматического выпуска (в результате чистый счет хранения 1)

Пока вы освобождаете массив в вашем dealloc, этот код верен.

2 голосов
/ 16 сентября 2009

Вы НЕ должны делать удержание после. Устанавливая @property для retain, некоторые особые вещи случаются при использовании self.Monate setter

1) Все, что есть в переменной экземпляра Monate, если оно есть, получит освобождение.
2) новое задание получит сохранение.

если бы вы использовали @property для assign, то вам пришлось бы сохранить, но с вами все в порядке.

В качестве дополнительного примечания, в target-c заглавные слова обычно зарезервированы для имен классов. Я предлагаю изменить его на «monate» вместо «Monate», так как это может привести к путанице в будущем

0 голосов
/ 16 сентября 2009

[NSArray arrayWithContentsOfFile:]; возвращает автоматически освобожденный массив, который потребует сохранения, если вы хотите, чтобы он зависал дольше, чем конец метода.

Обратите внимание, как в объявлении свойства указано «сохранить». Это означает, что любое self.property = x; звонки, которые вы делаете, сохраняют передаваемый вами объект.

Так что то, что ты там делаешь, правильно. Просто не забудьте сделать self.property = nil; в вашем методе dealloc.

Установка свойства для nil освободит старый объект и установит указатель на nil, что является правильным способом сделать это.

...