【问题标题】:iOS method with weak versus strong弱与强的iOS方法
【发布时间】:2013-10-22 13:53:28
【问题描述】:

我一直在阅读有关使用 ARC 时强和弱的信息。现在我想我对属性的理解要好一些。

但我刚刚读到我可以在方法中使用 __weak 和 __strong 。但我不确定我是否完全明白这一点。我的使用方法是:

- (void)someMethod{
   __weak NSString *text = [self.textField text];
   etc...
}

在上面的示例中,我使用了弱,因为否则它将是标准的强,我不需要指向它的强指针(我认为)。因为文本字段本身会保留它?

我的问题是我是否理解这个概念,使用 __weak 代替默认的 __strong 是否有优势?

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    是的,默认情况下text 将是强引用,只要引用存在,对象 (self.textField text) 就会保持活跃。但是,使用 __weak 引用,对象的生命是由self.textField 决定的。

    但是,声明 __weak NSString *text 并没有真正的内存优势(至少在这种特殊情况下)。所以,我建议使用默认行为(NOT 将文本声明为 __weak

    NSString *text = [self.textField text];
    

    一般来说,__weak 建议避免循环引用,例如delegate

    @property (nonatomic, weak) id delegate;
    

    【讨论】:

      【解决方案2】:

      您只需要在特殊情况下使用它。在这样的普通方法中,您可以使用 NSString *text

      这个指针会很强大,但这不是问题,因为如果没有人使用它,它将在方法结束时被销毁

      【讨论】:

        【解决方案3】:

        将其声明为弱风险,即当您尝试访问对象 'text 时它可能为零。 'weak' 在这里的意思是:如果没有引用 'text' 的 'strong' 对象,那么一旦 'someMethod' 完成执行,'text' 将被删除。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-11-01
          • 1970-01-01
          • 2020-02-19
          • 1970-01-01
          • 2013-10-01
          • 2012-07-12
          • 1970-01-01
          相关资源
          最近更新 更多