【问题标题】:weakSelf & Delegate弱自我和委托
【发布时间】:2017-12-23 04:29:23
【问题描述】:

如我们所知,我们将声明一个可以打破强引用循环的弱委托对象:

// MyObject.h

...

@property (nonatomic, weak) id<MyDelegate> delegate;

...

// ViewController.m

...

 self.myObject.delegate = self;

...

我想知道:我们可以用strong声明委托,并为其设置一个weakSelf:

// MyObject.h

...

@property (nonatomic, strong) id<MyDelegate> delegate;

...

// ViewController.m

...

__weak typeof(self) weakSelf = self;
self.myObject.delegate = weakSelf;

...

【问题讨论】:

  • 可以,但你不应该故意创建潜在的强引用循环;从逻辑上讲,当您将 weakSelf 分配给您的 strong 属性时,它立即获得了 strong 引用。
  • 会不会造成引用循环?
  • 只要你有一个strong 指针,你可以在这种情况下创建一个强引用循环。

标签: ios memory-management delegates


【解决方案1】:

委托是 Cocoa 和 CocoaTouch 框架中使用的一种常见设计模式,其中一个类将实现某些功能的责任委托给另一个类。这遵循关注点分离的原则,其中框架类实现通用功能,而单独的委托实例实现特定用例。

建议使用较弱的委托属性来帮助避免保留周期。有关解释,请查看@Bary Walk 和here。但是,在某些用例中,强引用是首选,甚至是必要的。 Apple 在 NSURLConnection 中使用它:一个 NSURLConnection 实例只能使用一次。完成后(无论是失败还是成功),它都会释放委托,并且由于委托是只读的,因此不能(安全地)重用它。检查 this 以前的 SO 问题以供参考。

【讨论】:

    【解决方案2】:

    据我所知,声明一个对象是弱的,这意味着你不拥有那个对象,所以给它分配强委托是行不通的。

    【讨论】:

      猜你喜欢
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多