我有一个类从核心数据中检索数据并将其存储到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,仍然无法正常工作。
答案 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)。