Сбой приложения при выпуске UITableViewController - PullRequest
0 голосов
/ 25 сентября 2010

У меня есть класс, который извлекает данные из основных данных и сохраняет их в NSMutablearray. У него также есть функция, которая возвращает этот массив.

datamanager.h:

@interface DataManager : NSObject {

    NSMutableArray *feedItems;
    ...    
}

@property (nonatomic, retain) NSMutableArray *feedItems; 
...

datamanager.m:

...
-(void)loadNews{
    (load data from core data and put it in self.feedItems) 
    ....
}

-(NSMutableArray*)getAllItems{
    return self.feedItems;
}

Теперь у меня есть UIViewController с 2 UIviews (View1 и View2) в качестве IBOutlets. Когда кнопка в View1 нажата, она выбирает данные из класса datamanager и устанавливает их как NSMutablearray для использования для UItableviewController (tableView1).

После выделения и инициализации tableView1 и настройки массива Nsmutablearray для заполнения таблицы я добавляю его представление в качестве подпредставления для View 2. Теперь моя проблема заключается в том, что после освобождения tableview1 после этой процедуры я получаю EXEC_BAD_ACCESS.

Кнопка IB1 вида ViewAction:

-(void)loadItems{
    if ([[dataManager getAllNews] count] > 0) {
        ItemTableViewController *tableView1 = [[ItemTableViewController alloc] initWithNibName:@"ItemTableViewController" bundle:nil];

        [tableView1 setItemList:[sectionManager getAllItems]];

        for (UIView *view in View2.subviews) {
            [view removeFromSuperview];
        }

        [View2 addSubview:tableView1.view];

        [tableView1 release]; // if this is not released it works properly else EXEC_BAD_ACCESS
    }

}

функция tableView1 setItemList:

-(void)setItemList:(NSMutableArray *)list{
    self.ItemList = list; //self.ItemList is a NSMutableArray
}

Как правильно разблокировать tableView1? Я тоже пробовал авто-релиз, все еще не работает.

Ответы [ 3 ]

0 голосов
/ 25 сентября 2010

Существует различие между UITableView и UITableViewController.Контроллер должен держаться до тех пор, пока используется представление, поэтому вы не должны выпускать там UITableViewController (tableView1).

Отпустите его, например, в методе dealloc.

Также, почемуу вас есть метод -(NSMutableArray*)getAllItems?Это ненужный шаг, поскольку синтезированное свойство уже генерирует геттеры и сеттеры.

0 голосов
/ 25 сентября 2010

UITableViewControllers предназначены для использования с UINavigationControllers и / или UITabBarControllers. Они не предназначены для использования так, как вы это делаете.

Вы МОЖЕТЕ заставить это работать, но вы действительно боретесь с ОС.

Вы должны либо переключиться на настройку UINavigationControllers, либо просто использовать прямой UITableView (без прохождения UITableViewController).

0 голосов
/ 25 сентября 2010

Если вы используете UIViewController таким образом, вы должны сохранить свой tableView1, а затем выпустить его позже, когда он больше не используется. Это можно сделать, разместив

[tableView1.view removeFromSuperview];
[tableView1 release];

в вашем dealloc.

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