应用程序在UITableViewController发布时崩溃

时间:2010-09-25 10:40:45

标签: iphone objective-c cocoa-touch xcode

我有一个类从核心数据中检索数据并将其存储到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;
}

现在我有一个带有2个UIview(View1和View2)的UIViewController作为IBOutlets。当单击View1中的按钮时,它从datamanager类中获取数据,将其设置为NSMutablearray,以用于UItableviewController(tableView1)。

在分配和初始化tableView1并设置Nsmutablearray以填充表之后,我将其视图作为子视图添加到View 2.现在问题是当我在此过程之后发布tableview1时,我得到一个EXEC_BAD_ACCESS。

View1按钮IBAction代码:

-(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?我也试过autorelease,仍然无法正常工作。

3 个答案:

答案 0 :(得分:0)

如果您以这种方式使用UIViewController,则必须保留tableView1,然后在不再使用时释放它。这可以通过放置

来完成
[tableView1.view removeFromSuperview];
[tableView1 release];

dealloc

答案 1 :(得分:0)

UITableView和UITableViewController之间存在差异。只要使用视图,控制器就应该保持不变,所以你不应该在那里释放UITableViewController(tableView1)。

例如,在dealloc方法中释放它。

另外,为什么你有-(NSMutableArray*)getAllItems方法?这是一个不必要的步骤,因为合成属性已经生成了getter和setter。

答案 2 :(得分:0)


UITableViewControllers旨在与UINavigationControllers和/或UITabBarControllers一起使用。它们并不意味着以你的方式使用它们。

你可以做到这一点,但你真的在与操作系统作斗争。

您应该切换到UINavigationControllers设置,或者只使用直接的UITableView(不通过UITableViewController)。