设置委托和数据源时应用程序崩溃

时间:2010-03-10 11:19:57

标签: delegates uitableview

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

- (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

如果删除协议,它也无效。

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您正在发布shareListController控制器。这是错误的,因为两者都将dataSource属性以及表视图的delegate属性声明为具有保留策略assign,这意味着它们 retain他们的价值观。这是客户端应用程序/视图控制器的职责。

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

请参阅UITableView Reference

最好的方法似乎是在视图控制器中声明一个ivar,如:

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

MyViewController的{​​{1}}(或者,您设置表格视图的任何其他地方)viewDidLoad / alloc照常init,而是在设置shareListControllerdataSource属性后释放对象时,您会记住delegate ivar中的引用(您仍然拥有它)。

最后,在视图控制器的shareListController方法中,执行:

dealloc