【问题标题】:Objective-C: Are blocks defined inside of methods strong or weak?Objective-C:在方法内部定义的块是强还是弱?
【发布时间】:2016-03-24 17:57:53
【问题描述】:

我有这样的情况:

- (void)someMethod
{
    __weak typeof(self) weakSelf = self;

    void (^myBlock1)(void) = ^{
        // ... do stuff
    };

    void (^myBlock2)(void) = ^{
        [weakSelf doSomeHeavyNetworkCall2:^{
            myBlock1();
        }];
    };

    [self doSomeHeavyNetworkCall1:^{
        myBlock2();
    }];
}

在这种情况下,myBlock1 和 myBlock2 的生命周期是什么?我应该像这样检查 nil 吗?

void (^myBlock2)(void) = ^{
    [weakSelf doSomeHeavyNetworkCall2:^{
        if (myBlock1) {
            myBlock1();
        }
    }];
};

[self doSomeHeavyNetworkCall1:^{
    if (myBlock2) {
        myBlock2();
    }
}];

另外,如果我将整个 someMethod 包裹在 @synchronized 中,我能保证周围有块吗?

【问题讨论】:

  • someMethod重新包装在@synchronized中,注意如果这些块异步运行,它们将不会被同步。 @synchronized 指令仅影响同步运行的指令。如果您的意图是同步回调,则必须将 @synchronized 指令放在 inside 块中,而不是包装 someMethod

标签: ios objective-c concurrency block


【解决方案1】:

在 Objective-C 中,局部变量默认是强的,所以 myBlock1myBlock2 是强的。不需要if (myBlock1)if (myBlock2) 检查。

@synchronized 包装someMethod 的内容对这些变量的生命周期没有影响。

【讨论】:

  • 谢谢。因此,如果它们被保留,则意味着该实例也被保留。这是否意味着我也不需要__weak typeof(self) weakSelf = self;[weakSelf doSomeHeavyNetworkCall2:^{
  • weakSelf 的使用是与潜在参考周期相关的完全独立的问题。但这与myBlock1myBlock2 变量无关。
猜你喜欢
  • 2014-01-04
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
相关资源
最近更新 更多