Iphone UITableViewController发布后应用程序崩溃
我有一个从核心数据中检索数据并将其存储到NSMutablearray的类。它还有一个返回此数组的函数 datamanager.h:Iphone UITableViewController发布后应用程序崩溃,iphone,objective-c,cocoa-touch,xcode,Iphone,Objective C,Cocoa Touch,Xcode,我有一个从核心数据中检索数据并将其存储到NSMutablearray的类。它还有一个返回此数组的函数 datamanager.h: @interface DataManager : NSObject { NSMutableArray *feedItems; ... } @property (nonatomic, retain) NSMutableArray *feedItems; ... datamanager.m: ... -(void)loadNews{
@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,其中有两个UIView(View1和View2)作为IBOutlet。单击View1中的按钮时,它将从datamanager类获取数据,并将其设置为NSMutablearray,以用于UItableviewController(tableView1)
在分配和初始化tableView1并设置Nsmutablearray来填充表之后,我将其视图作为子视图添加到视图2中。现在我的问题是,当我在这个过程之后释放tableview1时,我得到了一个EXEC\u BAD\u访问权限
View1按钮iAction代码:
-(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?我也尝试过自动释放,但仍然不起作用。如果您以这种方式使用UIViewController,您必须保留tableView1,然后在以后不再使用时释放它。这可以通过放置
[tableView1.view removeFromSuperview];
[tableView1 release];
在您的
dealloc
中,UITableView和UITableViewController之间存在差异。只要使用视图,控制器就应该保持不变,因此不应该在那里释放UITableViewController(tableView1)
例如,在dealoc方法中释放它
另外,为什么有一个-(NSMutableArray*)getAllItems
方法?这是一个不必要的步骤,因为合成属性已经生成了getter和setter。UITableViewController设计用于UINavigationController和/或UITableViewController。它们不应该像你这样使用 你可以做到这一点,但你真的在与操作系统作斗争
您应该切换到UINavigationControllers设置,或者只使用直接的UITableView(不通过UITableViewController) 非常好的建议,无论如何苹果都不推荐在视图控制器中使用视图控制器。这有可能在应用商店中被拒绝吗?我真的很想知道。你所说的对抗操作系统是什么意思?苹果不会因为你所做的事而责骂你,但我所说的“对抗操作系统”是指:视图控制器(在iPhone上)设计得最好,可以通过Nav/TAB控制器实现全屏视图。他们可以像你一样工作,但是你会失去他们的许多好处,做更多的工作。