具有强引用循环的块和对象?
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
指向的对象不是self
和innerSelf
指向的同一个对象在函数中间释放。如果您要在函数中多次使用 weakSelf
并依赖那些时间的状态保持一致,这只是一个问题。通过使用 innerSelf
,它将使其始终指向现有对象,或始终指向 nil
。因为你在这里只用了一次weakSelf
,所以没有必要。
当你创建一个 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
指向的对象不是self
和innerSelf
指向的同一个对象在函数中间释放。如果您要在函数中多次使用 weakSelf
并依赖那些时间的状态保持一致,这只是一个问题。通过使用 innerSelf
,它将使其始终指向现有对象,或始终指向 nil
。因为你在这里只用了一次weakSelf
,所以没有必要。