Глупая проблема управления памятью, которая поставила меня в тупик - PullRequest
0 голосов
/ 14 апреля 2011

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

@property(nonatomic, retain) UITableView *settingsTableView;

Тогда в моем viewDidLoad методе у меня есть:

self.settingsTableView = [[[UITableView alloc] initWithFrame:tableFrame style:UITableViewStyleGrouped] autorelease];
[self.view addSubview:self.settingsTableView];
[self.settingsTableView release];

Затем в методе dealloc контроллера представления у меня есть:

[settingsTableView release];

Когда я пытаюсь сделать релиз из dealloc, я получаю «сообщение, отправленное на освобожденный экземпляр». Я сам начинаю догадываться, кто-нибудь видит что-нибудь глупое в том, что я сделал?

Очень ценю помощь в этом!

Ответы [ 5 ]

6 голосов
/ 14 апреля 2011

вы звоните release на объект, который вы уже autorelease d.Просто избавьтесь от строки

[self.settingsTableView release];

и все будет хорошо.

Обратите внимание, что вы должны сохранить выпуск в методе dealloc, поскольку вызовы свойств сохраняютдля тебя, но не отпускай.

4 голосов
/ 14 апреля 2011

Две вещи. Во-первых, вы перевыпускаете представление таблицы в первую очередь: вызов autorelease отменяет необходимость в ручном release впоследствии.

Кроме того, в общем, то, что вы выпускаете в -dealloc, - это вещи, которые вы создали в -init, -initWithCoder:, или что-то еще, а не loadView или -viewDidLoad. В этом случае вы ищете метод -viewDidUnload; вам просто нужно установить self.settingsTableView в nil в этом методе, и установщик свойств будет обрабатывать его освобождение при необходимости.

2 голосов
/ 14 апреля 2011

Вот изменение, которое вам нужно сделать.

self.settingsTableView = [[[UITableView alloc] initWithFrame:tableFrame style:UITableViewStyleGrouped] autorelease];
[self.view addSubview:self.settingsTableView];
[self.settingsTableView release];
//^^^ This line is bad no need to release this value until dealloc
//if it is defined as retain or copy
1 голос
/ 14 апреля 2011

Я полагаю, что проблема связана с использованием autorelease при выделении и инициализации UITableView.

У вас также может быть проблема с выпуском settingsTableView сразу после его использования, по сравнению сметод dealloc.Каждый раз, когда вы выделяете / инициализируете объект, вы должны освобождать его только один раз.

Если вы используете autorelease, правила немного отличаются, поэтому я рекомендую прочитать об этом еще раз.Кроме того, когда вы передаете объекты, которые вы создали, другим вещам, они могут получить полное или совместное владение объектом, сохранив его, что означает, что вам может потребоваться или не потребоваться выпускать его самостоятельно.Документация для этого должна быть в методе, который вы вызываете (например, addSubView).

1 голос
/ 14 апреля 2011

Кажется очевидным. Вы уже выпустили с

[self.settingsTableView release];

Так зачем отпускать его снова в dealloc?

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