Выделение имущества

56
8

Работа над другим кодом. При анализе проекта выполнялся фрагмент кода

self.groupPicker = [[UIPickerView alloc] initWithFrame:CGRectMake(0,260,320,216)];
self.groupPicker.delegate = self;
self.groupPicker.showsSelectionIndicator = YES;
[self.view addSubview:self.groupPicker];

Где groupPicker является свойством UIPicker. При анализе проекта я столкнулся с потенциальным предупреждением об утечке в этом случае. Я также заметил, что свойство groupPicker не освобождается в методе dealloc. Также _groupPicker выпущен нигде в проекте. Что делать в этом случае?

Должен ли я удалить свойство UIPicker и просто объявить переменную UIPicker.

Должен ли я просто отпустить groupPicker, например [_groupPicker release];

Каким будет счетчик сохранения groupPicker, поскольку он сохраняется один раз в файле.h и снова выделяется, как показано в приведенном выше фрагменте кода.

спросил(а) 2012-05-22T16:29:00+04:00 8 лет, 1 месяц назад
1
Решение
55

1) Нет, прекрасно иметь свойство, проблема в том, что он сохраняется. Когда вы выделяете /init, счетчик удержания равен 1, вы используете сохраненное свойство, которое снова увеличивает счет сохранения. Счет удержания теперь равен 2, и если вы освободите объект в dealloc, вы получите счет сохранения 1, то есть просочившийся объект.

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

self.groupPicker = [[[UIPickerView alloc] initWithFrame:CGRectMake(0,260,320,216)] autorelease];

2) Все, что вы сохраняете, должно быть выпущено в dealloc, поэтому в dealloc вы должны

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

ответил(а) 2012-05-22T16:44:00+04:00 8 лет, 1 месяц назад
38

Хотя использование ARC для приложений iOS5+ должно быть предпочтительным, если вы не хотите этого делать, просто используйте autorelease после метода init.

ответил(а) 2012-05-22T16:40:00+04:00 8 лет, 1 месяц назад
39

Осторожно! Когда вы устанавливаете свойство типа

self.property1 = x;

и свойство1 объявляется как сохранение, предыдущий объект в свойстве 1 освобождается и новый объект (x) сохраняется. Вот почему:

self.property1 = [[x alloc] init];

когда свойство1 объявляется как сохранение, будет удерживать x дважды. (один для init, один для установки свойства). Правильный способ - объявить объект, установить его свойство и затем высвободить

object x = [[class alloc] init];
self.property1 = x;
[x release];

Таким образом, вы даете "ответственно" освобождение объекта x владельцу собственности.

ответил(а) 2012-05-22T16:36:00+04:00 8 лет, 1 месяц назад
39

Вы должны использовать ARC (автоматический подсчет ссылок)

сделать так, чтобы изменить> refactor> convert to object c ARC

ответил(а) 2012-05-22T16:33:00+04:00 8 лет, 1 месяц назад
-4

Либо присвойте UIPickerView _groupPicker (или независимо от имени экземпляра экземпляра), либо используйте autorelease по значению при его назначении.

(Проблема в том, что присвоение сохраненному свойству вызывает сохранение, и уже там сохраняется объект из alloc.)

ответил(а) 2012-05-22T16:33:00+04:00 8 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема