Таблица предупреждений памяти iOSПросмотр EXC_BAD_ACCESS в приложении с несколькими представлениями - PullRequest
1 голос
/ 23 февраля 2012

Я немного пытаюсь выяснить, как правильно настроить мои контроллеры представления для изящной обработки предупреждений памяти.

В настоящий момент я получаю сбой EXC_BAD_ACCESS из представления, находящегося дальше встек контроллера навигации всякий раз, когда приложение получает предупреждение о памяти.

В моем табличном представлении происходит неправильный доступ.Вот как я его создаю:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    UITableView *table = [[[UITableView alloc] initWithFrame:CGRectMake(self.view.bounds.origin.x, self.view.bounds.origin.y, self.view.bounds.size.width, self.view.bounds.size.height - self.navigationController.navigationBar.bounds.size.height) style:UITableViewStyleGrouped] autorelease];
    table.dataSource = self;
    table.delegate = self;

    self.tableView = table;
    [self.view addSubview:table];
    [table release];

    ...other stuff...
}

А вот мой viewDidUnload:

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
    self.tableView = nil;
}

После предупреждения о памяти вызывается viewDidUnload, как и ожидалось, но я получаю аварийный сбой EXC_BAD_ACCESS приself.tableView = nil строка.

Я настраиваю свой tableView в неправильном месте?Я не использую nib-файл, так что мне его собирать в другом месте?Я как-то неправильно передаю это контроллеру представления?и т. д.

Любая помощь будет высоко ценится.Я до сих пор не осознал последовательность событий, возникающих при предупреждении памяти, и предупреждения памяти уровня 1 кажутся неприятно распространенными.

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Попробуйте это:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    UITableView *table = [[[UITableView alloc] initWithFrame:CGRectMake(self.view.bounds.origin.x, self.view.bounds.origin.y, self.view.bounds.size.width, self.view.bounds.size.height - self.navigationController.navigationBar.bounds.size.height) style:UITableViewStyleGrouped] autorelease];
    table.dataSource = self;
    table.delegate = self;

    self.tableView = table;
    [self.view addSubview:table];
    //[table release]; You have already release table with autorelease.

    ...other stuff...
}
2 голосов
/ 23 февраля 2012

Вы звоните release дважды на table;один раз с отложенным релизом с autorelease при его создании, и снова с [table release]; после того, как вы добавили его как подпредставление self.view.Помните, что если свойство для tableView имеет значение «сохранить», оно будет сохранено при назначении (при назначении с точечным синтаксисом) - и что addSubview также сохранит table при добавлении.Итак, вам просто нужно оставить там autorelease - начиная с этого отложенного выпуска (который будет уравновешен удержанием, которое произойдет, когда вы скажете self.tableView = table;.

...