iOS Viewcontroller参考表视图IBOutlet - 弱还是强?

时间:2016-02-03 12:02:59

标签: ios objective-c memory

当我在另一个问题中读到时,经验法则是:

当父级具有对子对象的引用时,应使用强引用。当子进程对其父对象有引用时,您应该使用弱引用或unsafe_unretained引用(如果前者不可用)。一个典型的场景是你处理代表。例如,UITableViewDelegate不保留包含表视图的控制器类。

嗯,在这种情况下,我有一个带有表视图IBOutlet的视图控制器。此表视图还使用视图控制器作为委托和数据源。根据上面的规则,视图控制器充当父视图,因此我应该对表视图有一个强引用 - 表视图应该具有对视图控制器的弱引用。

我不确定如何定义后一个弱引用 - 我正在设置

tableView.delegate = self;
tableView.dataSource = self;

我怎么能让自己变弱?或者这不是正确的方法吗?

4 个答案:

答案 0 :(得分:2)

您只需将插座从UITableView拖到.h文件即可。 Xcode将为您创建适当的属性。在命名Outlet时,您也可以从那里选择弱/强类型。

如果您想手动创建,可以将此行添加到.h文件中:

@property (weak, nonatomic) IBOutlet UITableView *tblView;

但请记住,即使将此行添加到.h.文件后,您仍然需要将其连接到UITableView

另外,请不要忘记让ViewController符合UITableViewDelegate,如下所示:

@interface MyTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

然而,在你的标题中,你似乎对弱和强属性之间的区别感到困惑。 Ole Begemann已经This question精彩地回答了这个差异。

答案 1 :(得分:1)

你写的代码很好。你不必让自己变弱。委托和数据源属性在UITableView definition中声明为弱。

答案 2 :(得分:0)

根据UITableView.h,

委托数据源已经很弱。

@property (nonatomic, weak, nullable) id <UITableViewDataSource> dataSource;
@property (nonatomic, weak, nullable) id <UITableViewDelegate> delegate;

如果任何实例设置为委托,并且tableview实例

不会保留数据源

当你制作一个IBOutlet时,就像这样。如果图像

中显示强弱,则选择弱
@property (weak, nonatomic) IBOutlet UITableView *tableview;

enter image description here

由于视图已被视图保留(即自我视图)

答案 3 :(得分:0)

就像UIKit Control中的视图一样,以列表形式显示数据。它不是儿童控制器。所有UIKit项目都被称为弱项。