Ios 弧块保持循环
有人能确认一下下面的模块是否正在变成一个保留周期吗?请注意,该块由SampleClass2而不是SampleClass1调用Ios 弧块保持循环,ios,automatic-ref-counting,block,retain-cycle,Ios,Automatic Ref Counting,Block,Retain Cycle,有人能确认一下下面的模块是否正在变成一个保留周期吗?请注意,该块由SampleClass2而不是SampleClass1调用 @interface SampleClass1{ NSArray *_array; } @implementation SampleClass1 -(void) doSomething { SampleClass2 *sampleClass2 = [[SampleClass2 alloc] init]; [sampleClass2 doAnot
@interface SampleClass1{
NSArray *_array;
}
@implementation SampleClass1
-(void) doSomething {
SampleClass2 *sampleClass2 = [[SampleClass2 alloc] init];
[sampleClass2 doAnother:^(NSArray *anotherArray){
_array = anotherArray; // _array is an ivar
}];
}
@end
只有当块保留在ivar或属性中时,才能有保留周期。我们看不到
-[SampleClass2 doother:
对块做了什么,所以我们不知道
块通过引用ivar\u数组
隐式地捕获了自身
,因此有可能形成一个引用循环。它取决于谁保留了SampleClass1
实例,以及SampleClass2
对块做了什么。- 块是否保留自身的
?对self
是否保留块?大概这取决于sampleClass2
方法的作用。没有代码,就不可能说doather:
- 即使我们假设
保留块,是否存在保留周期?不存在。有一个连接sampleClass2
,但是在显示的代码中没有从sampleClass2->block->self
到self
的连接sampleClass2
doother:
方法最终保留了块,那么将有一个引用循环。不是真的-如果SampleClass2保留(复制)对象解除分配后它将释放的块-块本身在任何地方都不保留SampleClass2。@GrzegorzKrukowski,这取决于整个所有权图。如果块由sampleClass2
保留,而sampleClass2
由SampleClass1
实例保留,则存在一个循环。