2010-03-10 16 views
0

如果我想为我的应用程序设置我的委托和数据源,我的应用程序崩溃。我做错了什么?设置代理和数据生成时崩溃的应用程序

- (void)loadView { 
NSLog(@"AddListViewController"); 
ShareListViewController *shareListViewController = [[ShareListViewController alloc] init]; 

UITableView *shareListView = [[UITableView alloc]initWithFrame:CGRectMake(100, 30, 100,  200) style:UITableViewStylePlain]; 

shareListView.delegate = shareListViewController; 
shareListView.dataSource = shareListViewController; 


[self.navigationController.view addSubview:shareListView]; 

[shareListViewController release]; 
} 

而且我ShareListViewController

@interface ShareListViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource>{ 

} 

@end 

它也没有工作,如果我删除的协议。

THX对您有所帮助

回答

1

您正在释放的shareListController控制器。这是错误的,因为这两个,dataSource属性以及delegate属性的表视图被声明为具有保留策略assign,这意味着,他们做而不是retain它们的值。这是客户端应用程序/视图控制器的责任。

@property(nonatomic, assign) id<UITableViewDelegate> delegate 
@property(nonatomic, assign) id<UITableViewDataSource> dataSource 

查看UITableView Reference

最好的办法似乎是在像您的视图控制器声明伊娃:

@interface MyViewController: UIViewController { 
    ... other stuff ... 
    UITableView* shareListView; 
    ShareListController* shareListController; 
} 
... more stuff ... 
@end 

MyViewControllerviewDidLoad(或者其他任何地方设置了表视图)alloc/initshareListController为通常,但在您设置了dataSourcedelegate属性之后,您不会记住该对象,而是记得 ivar中的参考资料(您仍然拥有它)。

最后,在视图控制器的dealloc方法,这样做:

- (void) dealloc { 
    ... release other stuff ... 
    shareListView.delegate = nil;  // Really, really defensive 
    shareListView.dataSource = nil; // here, but it won't hurt 
    [shareListView release]; 
    [shareListController release]; 
    [super dealloc]; 
} 
+0

我想最简单的方法是做一个简单的自动释放。但这也没有帮助。你会推荐什么? – gabac 2010-03-10 11:46:22

+0

哦,是的。对不起,完全没有得到它!非常感谢! Grüsseaus der Schweiz – gabac 2010-03-10 13:30:56

+0

Grüsein die Schweiz :-) – Dirk 2010-03-10 13:36:12

相关问题