iOS ARC块保留周期

时间:2013-12-12 16:26:20

标签: ios automatic-ref-counting block retain-cycle

有人可以确认下面的区块是否会变成保留周期吗?请注意,SampleClass2调用块而不是SampleClass1。

@interface SampleClass1{
    NSArray *_array;
}

@implementation SampleClass1

-(void) doSomething {
    SampleClass2 *sampleClass2 = [[SampleClass2 alloc] init];
    [sampleClass2 doAnother:^(NSArray *anotherArray){
        _array = anotherArray;      // _array is an ivar
    }];
}

@end

2 个答案:

答案 0 :(得分:1)

  • 该块是否保留self是。
  • sampleClass2是否会保留该块?可能。这取决于doAnother:方法的作用。没有代码,就不可能说出来。
  • 即使我们假设sampleClass2保留了块,是否有保留周期?否。存在连接sampleClass2 -> the block -> self,但是显示的代码中没有任何地方存在从selfsampleClass2的连接。

答案 1 :(得分:0)

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

该块通过引用ivar self隐式捕获_array,因此有可能形成参考周期。这取决于谁保留SampleClass1实例以及SampleClass2对该块执行的操作。