当你创建一个具有块的类的实例时,它指向该块作为强引用,当你从该块引用该对象时,它指向具有强引用的对象,这会创建一个强大的参考周期。
所以,如果我这样做:
__weak Employee *weakSelf = self;
myBlock = ^{
NSLog(@"%@", weakSelf);
}
所以现在,块对对象有一个弱引用,但是假设在自身指向的对象被解除分配的情况下,在块内创建一个强大的本地引用是一种很好的做法。
__weak Employee *weakSelf = self;
myBlock = ^{
Employee *innerSelf = weakSelf;
NSLog(@"%@", innerSelf);
}
我想知道并确保我理解正确,所以我画了一张我认为正在发生的事情(如果我错了,请纠正我):
非常感谢更正的视觉效果。
答案 0 :(得分:0)
这些都不正确。
这里只有两个对象。一个Employee
对象。一块。那就是它。
您没有显示myBlock
被声明为什么,但假设它是Employee
的实例变量,那么是,通过该赋值,{{1} object对该块有强烈的引用。
该块具有对Employee
对象的弱引用,因为它从周围的作用域捕获局部变量Employee
,并通过捕获它,它会生成一个隐含的"实例变量&# 34;在具有与捕获变量相同的内存管理特性的块中(在这种情况下,弱)。
块内的weakSelf
无关紧要。它只是一个局部变量。局部变量不是实例变量,因此它们不是引用另一个的一个对象的一部分。局部变量仅在函数的特定调用期间存在。它们不会导致循环。
strongSelf
的原因是,innerSelf
指向的对象(weakSelf
和self
指向的同一对象)未被解除分配功能的中间。如果您要在函数中多次使用innerSelf
,并且依赖这些时间的状态保持一致,这只是一个问题。通过使用weakSelf
,它将使其始终指向现有对象,或始终如一地innerSelf
。由于您在这里仅使用nil
,因此没有必要。