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 
+1

没关系。只要你不保留自己,你可以在里面使用self。 –

  • 该块是否保留self是的。
  • 请问sampleClass2是否保留该块?也许吧。这取决于doAnother:方法的作用。没有代码,就不可能说。
  • 即使我们假设sampleClass2保留该块,是否存在保留周期?编号有一个连接sampleClass2 -> the block -> self,但没有显示的代码是从selfsampleClass2的连接。

当块保留在ivar或属性中时,只能有一个保留周期。我们没有看到-[SampleClass2 doAnother:]与块做什么,所以我们不知道。

该块通过引用ivar _array隐式捕获self,所以有可能形成参考循环。这取决于谁保留SampleClass1实例以及SampleClass2如何处理该块。

+1

无论你在一个块内做什么都不会影响块之外的保留周期。保留周期的唯一情况是当您保留块本身时,例如:[self block:^(id smth){ [self function];你也可以说“有机会” - 要么有保留周期,要么没有:) }]; –

+1

@GrzegorzKrukowski如果'doAnother:'方法结束保留块,那么将会有一个参考周期。 – rmaddy

+1

并非如此 - 如果SampleClass2保留(复制)一个块,它将在释放对象之后释放它 - 并且块本身不会在任何地方保留SampleClass2。 –