强 vs 弱 - 如何定义可能连接或不连接到 IBOutlet 的属性?

Posted

技术标签:

【中文标题】强 vs 弱 - 如何定义可能连接或不连接到 IBOutlet 的属性?【英文标题】:Strong vs weak - How to define a property that may or may not be connected to a IBOutlet? 【发布时间】:2016-01-08 00:10:35 【问题描述】:

我正在编写一个具有 UITableView 属性作为 IBOutlet 的可重用类。但是,如果该类未连接到 xib 并因此为零,我希望该类创建一个 UITableView。如果我将它设置为弱,那么以编程方式分配 UITableView 似乎不起作用。但是,如果我让它变得强大,那么如果使用 xib,它不一定会正确释放。处理这种情况的最佳方法是什么?

【问题讨论】:

只要将表格视图添加到分配表格视图的同一块中的某个父视图中,表格视图属性就会很弱。 为什么没有正确释放!当视图控制器被释放时,您的自定义类也将被释放。因此,strong 属性也将被释放。 【参考方案1】:

当作者知道其他人保留了对象时,通常会声明属性是弱的。一个很好的例子是一个视图控制器,它希望保留指向其主视图的子视图的指针。主视图的子视图集合是一个数组,该数组保留其元素(子子视图以此类推)。

因此,将表视图声明为弱是正确的,无论它是否是通过 IBOutlet 设置的。但是初始化一个弱指针需要一些技巧,以便您可以先建立与对象的保留关系,然后再对弱属性进行赋值。

演示:

// assumes
@property(weak, nonatomic) IBOutlet UITableView *tableView;

- (void)viewDidLoad 
    [super viewDidLoad];

    if (!self.tableView)   // if the outlet was not setup in IB
        // declare a stack variable that will be retained within the scope of this condition
        UITableView *tableView = [[UITableView alloc] init];
        // do whatever is needed to configure the tableView pointed to by this stack variable

        // this is key, make it a subview (establishing a retained relationship with subviews) first
        [self.view addSubview:tableView];
        // now we can assign it to our weak property
        self.tableView = tableView;
    

【讨论】:

这是完美的。首先创建 UITableView *tableView =.... 并将其设置为弱属性修复它。

以上是关于强 vs 弱 - 如何定义可能连接或不连接到 IBOutlet 的属性?的主要内容,如果未能解决你的问题,请参考以下文章

发现另一个 ios 设备而不连接到公共网络

c# dllimport怎么弱引用

社会计算中一些名词笔记

如何在不连接到开放式办公室的情况下查看 .odb 数据库文件的内部?

从 websockets 更新数据时,如何在不连接到每个子组件的情况下更新单个子组件?

__attribute__((weak))介绍以及用法