Нет.
Когда вы объявляете свойство как 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 Управление памятью документы.