iOS ARC块保留周期
有人可以确认下面的块是否正在变成保留周期吗?请注意,该块正在被SampleClass2而不是SampleClass1调用。iOS ARC块保留周期
@interface SampleClass1{
NSArray *_array;
}
@implementation SampleClass1
-(void) doSomething {
SampleClass2 *sampleClass2 = [[SampleClass2 alloc] init];
[sampleClass2 doAnother:^(NSArray *anotherArray){
_array = anotherArray; // _array is an ivar
}];
}
@end
-
该块是否保留
self
?是的。 -
请问
sampleClass2
是否保留该块?也许吧。这取决于doAnother:
方法的作用。没有代码,就不可能说。 -
即使我们假设
sampleClass2
保留该块,是否存在保留周期?编号有一个连接sampleClass2 -> the block -> self
,但没有显示的代码是从self
到sampleClass2
的连接。
当块保留在ivar或属性中时,只能有一个保留周期。我们没有看到-[SampleClass2 doAnother:]
与块做什么,所以我们不知道。
该块通过引用ivar _array
隐式捕获self
,所以有可能形成参考循环。这取决于谁保留SampleClass1
实例以及SampleClass2
如何处理该块。
无论你在一个块内做什么都不会影响块之外的保留周期。保留周期的唯一情况是当您保留块本身时,例如:[self block:^(id smth){ [self function];你也可以说“有机会” - 要么有保留周期,要么没有:) }]; –
@GrzegorzKrukowski如果'doAnother:'方法结束保留块,那么将会有一个参考周期。 – rmaddy
并非如此 - 如果SampleClass2保留(复制)一个块,它将在释放对象之后释放它 - 并且块本身不会在任何地方保留SampleClass2。 –
没关系。只要你不保留自己,你可以在里面使用self。 –