【问题标题】:iOS Viewcontroller with reference to table view IBOutlet - Weak or Strong?iOS Viewcontroller 参考表视图 IBOutlet - 弱还是强?
【发布时间】:2016-02-03 12:02:58
【问题描述】:

正如我在另一个问题中看到的,经验法则是:

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

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

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

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

我应该如何让自己变得虚弱?或者这不是正确的做法?

【问题讨论】:

  • 只需将插座从情节提要中的 TableView 拖到 .h 文件中。 Xcode 将把它变成一个弱 IBOutlet

标签: ios objective-c memory


【解决方案1】:

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

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

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

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

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

@interface MyTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

但是,在您的标题中,您似乎对 Weak 和 Strong 属性之间的区别感到困惑。 Ole Begemann 已经在 This question 上出色地回答了不同之处。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      根据 UITableView.h,

      delegatedatasource 已经很弱了。

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

      如果任何实例被设置为委托并且数据源将不会被 tableview 实例保留

      当你制作一个 IBOutlet 时,让它像这样。选择weak if its strong 默认为weak 如图所示

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

      由于视图已被添加的视图保留(即 self.view)

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-07
          • 2012-11-22
          • 1970-01-01
          • 2016-06-25
          • 1970-01-01
          • 1970-01-01
          • 2012-06-10
          • 2012-06-25
          相关资源
          最近更新 更多