Сбой приложения при настройке делегата и данных - PullRequest
0 голосов
/ 10 марта 2010

Если я хочу установить свой делегат и источник данных для моего 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 Ответ

1 голос
/ 10 марта 2010

Вы выпускаете контроллер shareListController. Это неправильно, поскольку как свойство dataSource, так и свойство delegate представления таблицы объявлены как имеющие политику хранения assign, что означает, что они не retain их ценности. Это ответственность клиентского приложения / контроллера представления.

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

См. Справочник UITableView .

Лучше всего объявить ivar в вашем контроллере вида следующим образом:

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

В MyViewController viewDidLoad (или, где бы вы ни настраивали представление таблицы) alloc / init shareListController как обычно, но вместо освобождения объекта после настройки Свойства dataSource и delegate, вы помните ссылку (она у вас есть) в shareListController 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...