具有强引用循环的块和对象?

Blocks and objects with Strong Reference Cycle?

当你创建一个 class 的实例时,它有一个块,它指向那个块作为强引用,当你从那个块引用对象时,它指向那个具有强引用的对象引用,这会创建一个强大的引用循环。

所以如果我这样做:

__weak Employee *weakSelf = self;
myBlock = ^{
    NSLog(@"%@", weakSelf);
}

所以现在,块对对象有一个弱引用,但最好在块内创建一个对 self 的强本地引用,以防 self 指向的对象被释放。

__weak Employee *weakSelf = self;
myBlock = ^{
    Employee *innerSelf = weakSelf;
    NSLog(@"%@", innerSelf);
}

我想知道并确保我理解正确,所以我画了一张我认为正在发生的事情的图片(如果我错了,请纠正我):

或者这是正确的:

将不胜感激修正后的视觉效果。

None 正确。

这里只有两个对象。一个 Employee 对象。还有一个街区。就是这样。

你没有显示 myBlock 被声明为什么,但假设它是 Employee 的一个实例变量,那么是的,通过那个赋值,Employee 对象有一个对该块的强引用。

该块对Employee对象有一个弱引用,因为它从周围的作用域中捕获局部变量weakSelf,通过捕获它,它使一个隐含的"instance variable"在与捕获变量具有相同内存管理特性的块中(在本例中为 weak)。

块内的strongSelf不相关。它只是一个局部变量。局部变量不是实例变量,因此它们不是引用另一个对象的一部分。局部变量仅在函数的特定调用期间有效。它们不会引起循环。

innerSelf的原因是weakSelf指向的对象不是selfinnerSelf指向的同一个对象在函数中间释放。如果您要在函数中多次使用 weakSelf 并依赖那些时间的状态保持一致,这只是一个问题。通过使用 innerSelf,它将使其始终指向现有对象,或始终指向 nil。因为你在这里只用了一次weakSelf,所以没有必要。