当我在另一个问题中读到时,经验法则是:
当父级具有对子对象的引用时,应使用强引用。当子进程对其父对象有引用时,您应该使用弱引用或unsafe_unretained引用(如果前者不可用)。一个典型的场景是你处理代表。例如,UITableViewDelegate不保留包含表视图的控制器类。
嗯,在这种情况下,我有一个带有表视图IBOutlet的视图控制器。此表视图还使用视图控制器作为委托和数据源。根据上面的规则,视图控制器充当父视图,因此我应该对表视图有一个强引用 - 表视图应该具有对视图控制器的弱引用。
我不确定如何定义后一个弱引用 - 我正在设置
tableView.delegate = self;
tableView.dataSource = self;
我怎么能让自己变弱?或者这不是正确的方法吗?
答案 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)
委托和数据源已经很弱。
@property (nonatomic, weak, nullable) id <UITableViewDataSource> dataSource;
@property (nonatomic, weak, nullable) id <UITableViewDelegate> delegate;
如果任何实例设置为委托,并且tableview实例
不会保留数据源当你制作一个IBOutlet时,就像这样。如果图像
中显示强弱,则选择弱@property (weak, nonatomic) IBOutlet UITableView *tableview;
由于视图已被视图保留(即自我视图)
答案 3 :(得分:0)
就像UIKit Control中的视图一样,以列表形式显示数据。它不是儿童控制器。所有UIKit项目都被称为弱项。