Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 弧块保持循环_Ios_Automatic Ref Counting_Block_Retain Cycle - Fatal编程技术网

Ios 弧块保持循环

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

有人能确认一下下面的模块是否正在变成一个保留周期吗?请注意,该块由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

只有当块保留在ivar或属性中时,才能有保留周期。我们看不到
-[SampleClass2 doother:
对块做了什么,所以我们不知道

块通过引用ivar
\u数组
隐式地捕获了
自身
,因此有可能形成一个引用循环。它取决于谁保留了
SampleClass1
实例,以及
SampleClass2
对块做了什么。

  • 块是否保留自身的
    self
    ?对
  • sampleClass2
    是否保留块?大概这取决于
    doather:
    方法的作用。没有代码,就不可能说
  • 即使我们假设
    sampleClass2
    保留块,是否存在保留周期?不存在。有一个连接
    sampleClass2->block->self
    ,但是在显示的代码中没有从
    self
    sampleClass2
    的连接

没关系。只要不保留块本身,就可以在块内使用self。在块内执行的任何操作都不会影响块外的retain循环。retain cycle的唯一情况是当您保留块本身时,例如:[self block:^(id smth){[self function];以及如何说“有机会”-要么有retain cycle,要么没有:)}]@GrzegorzKrukowski如果
doother:
方法最终保留了块,那么将有一个引用循环。不是真的-如果SampleClass2保留(复制)对象解除分配后它将释放的块-块本身在任何地方都不保留SampleClass2。@GrzegorzKrukowski,这取决于整个所有权图。如果块由
sampleClass2
保留,而
sampleClass2
SampleClass1
实例保留,则存在一个循环。