【问题标题】:Can't set datasource programmatically, getting EXC_BAD_ACCESS无法以编程方式设置数据源,获取 EXC_BAD_ACCESS
【发布时间】:2013-02-14 23:05:05
【问题描述】:

我正在尝试以编程方式为我的表视图设置数据源,我创建了一个类并实现了它(我不知道 implements 是否适合它,OC 新手,我来自 Java) UITableViewDataSource 协议。

@interface PlaylistController : NSObject <UITableViewDataSource, UITableViewDelegate>

在我的ViewControllerviewDidLoad 方法中,我尝试分配数据源,但我得到EXC_BAD_ACCESS

[playlistView setDataSource:[[PlaylistController alloc] initWithPlaylist:playlist]];

我不知道为什么?

从阅读这里 (SO) 我了解到它要么是强制转换问题(但我确实实现了所需的协议),要么是内存管理问题(但我使用的是 ARC,根本没有触及发布)

【问题讨论】:

  • I'm trying to set datasource programatically to my table view 怎么样?应该是我正在尝试以编程方式设置数据源 of 我的表格视图
  • 你是对的,修复它:)
  • 危险! @property(nonatomic, assign) id<UITableViewDataSource> dataSource(注意assign)!
  • 无论如何,你需要发布一个stacktrace。
  • 好吧,您不会说您使用的是 ARC 还是 MRR,这不是您立即面临的问题,但如果您使用的是 ARC,那么这样设置数据源将不会保留它(假设属性是assign)所以它几乎会立即消失。您需要将其分配给视图控制器的实例变量,然后将其设置为数据源。

标签: ios objective-c uitableview datasource


【解决方案1】:

代替

[playlistView setDataSource:[[PlaylistController alloc] initWithPlaylist:playlist]];

使用

[playlistView setDataSource:self];

原因:

您尝试将 DataSource 设置为 autorelease 中的实例。它被释放,你得到错误。

您应该将 dataSource 设置为self,以便它指向该类的当前实例。

【讨论】:

  • 如果我想将它分配给不同的类'实例该怎么办?
  • 创建一个 strong 类型的属性,然后将其分配为数据源。
  • 按照 trojanfoe 的建议赋予它 strong 与 assign 的属性有什么区别?
  • ARC 中的 strong 表示 retain 除非所有者释放它,否则它将存在,与 assignweak 相比。
  • 所以,如果我做对了,给它分配的属性,那就错了。因为 ARC 将能够在分配它的对象仍在使用时释放它?
【解决方案2】:

我在任何地方都没有看到 UITableView 对象集。

确保在 Nib 文件中创建并链接到 UITableView 的 IBOutlet。

@interface PlaylistController : NSObject <UITableViewDataSource, UITableViewDelegate>

IBOutlet UITableView* tableView;

@end

Then in your viewDidLoad you can do:

[tableView setDataSource:self]

【讨论】:

  • 这样做意味着将当前上下文实例 (ViewController) 设置为数据源,我不希望这样
  • 我已经更新了我的答案。但是,如果您扩展 UITableViewController 而不仅仅是 NSObject,则无需在 .h 文件中声明 UITableView。
猜你喜欢
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
相关资源
最近更新 更多