ios - 为什么弱强舞会保持循环?

标签 ios objective-c

这是我的代码:

NSLog(@"%p",self);

__weak typeof(self) weakSelf = self;
NSLog(@"%p", weakSelf);

[self setBlk:^{
    __strong typeof(weakSelf) strongSelf = weakSelf;
    NSLog(@"%p", strongSelf);

    strongSelf.str = @"foo";
}];

self.blk();
blkstr是属性(property)。

我得到了这样的日志:
2018-04-03 14:51:57.151946+0800 Block[20267:148833] 0x7fafa1506d90
2018-04-03 14:51:57.152177+0800 Block[20267:148833] 0x7fafa1506d90
2018-04-03 14:51:57.152359+0800 Block[20267:148833] 0x7fafa1506d90

结论是selfweakSelfstrongSelf指向同一个对象,它们的不同只是强或弱。在我看来,selfstrongSelf是相同的。所以我认为这段代码的内存是这样的:



我的困惑是当 block 执行时, block 将强引用自身,但如果自身没有同时释放,自身也是强引用 block 。它会导致保留循环吗?

最佳答案

在我看来,它不会导致保留周期。我认为你误解了一些观点。

  • block 不保留 self 的强引用,它保持弱引用。
  • selfstrongSelf不完全相同。
  • strongSelfweakSelf 的强引用不是 self 所以它不会导致保留周期。
  • 如果 self block 执行时未释放,strongSelf将是 self 的有力引用.但是strongSelf是一个局部变量,它只会使 self 在 block 完全执行之前无法被释放。
  • 关于ios - 为什么弱强舞会保持循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49624689/

    相关文章:

    ios - 从带有披露指示器的 TableView 单元格 xib 转到 Storyboard

    ios - 我应该在哪里保存文件

    iphone - 是否可以在 iphone 的设置中检测 facebook 登录状态?

    objective-c - 我如何接收 cocoa 绑定(bind)值已更改的通知?

    ios - ios获取关联文件类型图标

    c++ - C 的 -> 是否等同于 Objective-C 中的点符号

    ios - 在 iOS 中滚动时保留 TableView 单元格中的按钮状态

    objective-c - 用于假人的Objective-C:如何在NSDictionary内部循环浏览NSDictionary?

    objective-c - cocoa 应用程序中的VPN

    ios - 从 SKProductsRequest initWithProductIdentifiers 清空自动更新 iOS 应用内购买