Как правильно управлять назначением переменной экземпляра идентификатора, а затем сохранить - PullRequest
0 голосов
/ 08 июля 2011

У меня есть класс, у которого есть свойство:

@property (nonatomic, assign) id customDatePicker

В зависимости от выбора пользователя мне понадобится UIDatePicker или UIPicker, поэтому я буду вводить тип ivar и сохранять его, а затем освобождать его.Это правильный способ управления памятью свойства?

// init snippet
if (useUIDatePicker) {
  customDatePicker = (UIDatePicker *)[[[UIDatePicker alloc] initWithFrame:frame] retain];
} else {
  customDatePicker = (UIPickerView *)[[[UIPickerView alloc] initWithFrame:frame] retain];
}

- (void)dealloc {
  [customDatePicker release];
  [super dealloc];
}

1 Ответ

2 голосов
/ 08 июля 2011

Нет.

Когда вы объявляете свойство как assign, вы не должны сохранять объект.Опция assign используется для необъектных переменных и для ситуаций, когда свойство retain ed создает цикл, в котором оба объекта сохраняют друг друга.Объявление свойства как assign означает, что вы не будете управлять памятью объекта;Вам не следует ни вызывать retain, ни release.

Вы также чрезмерно сохраняете объект выбора.Сохранение объекта создает претензию на объект;Вы не хотите, чтобы это исчезло, пока вы не скажете, что с этим покончено.Вы отказываетесь от претензии, позволяя удалить объект, вызывая release.Когда вы звоните alloc, это создает тот же вид претензии, что и вызов retain.Итак, эта строка:

[[[UIDatePicker alloc] initWithFrame:frame] retain];

создает две заявки, одна для alloc и одна для retain.Позже вы вызываете release только один раз, что означает, что у вас всегда будет одна претензия к этому объекту, и она превратится в утечку памяти.

Что вы должны сделать:

@property (nonatomic, retain) id customDatePicker


if (useUIDatePicker) {
    customDatePicker = [[UIDatePicker alloc] initWithFrame:frame];
} else {
    customDatePicker = [[UIPickerView alloc] initWithFrame:frame];
}

Теперь у вас есть только одна заявка на сборщик, потому что вы использовали alloc.

(вам не нужно разыгрывать назначение; когда вы назначены универсальному указателю, вы можете использовать любойвид объекта.)

Также взгляните на Apple Управление памятью документы.

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