具有强参考周期的块和对象?

时间:2016-06-10 06:00:49

标签: objective-c automatic-ref-counting block weak-references

当你创建一个具有块的类的实例时,它指向该块作为强引用,当你从该块引用该对象时,它指向具有强引用的对象,这会创建一个强大的参考周期。

所以,如果我这样做:

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

所以现在,块对对象有一个弱引用,但是假设在自身指向的对象被解除分配的情况下,在块内创建一个强大的本地引用是一种很好的做法。

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

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

或者这是正确的: enter image description here

非常感谢更正的视觉效果。

1 个答案:

答案 0 :(得分:0)

这些都不正确。

这里只有两个对象。一个Employee对象。一块。那就是它。

您没有显示myBlock被声明为什么,但假设它是Employee的实例变量,那么是,通过该赋值,{{1} object对该块有强烈的引用。

该块具有对Employee对象的弱引用,因为它从周围的作用域捕获局部变量Employee,并通过捕获它,它会生成一个隐含的"实例变量&# 34;在具有与捕获变量相同的内存管理特性的块中(在这种情况下,弱)。

块内的weakSelf无关紧要。它只是一个局部变量。局部变量不是实例变量,因此它们不是引用另一个的一个对象的一部分。局部变量仅在函数的特定调用期间存在。它们不会导致循环。

strongSelf的原因是,innerSelf指向的对象(weakSelfself指向的同一对象)未被解除分配功能的中间。如果您要在函数中多次使用innerSelf,并且依赖这些时间的状态保持一致,这只是一个问题。通过使用weakSelf,它将使其始终指向现有对象,或始终如一地innerSelf。由于您在这里仅使用nil,因此没有必要。