2013-12-12 156 views
0

有人可以確認下面的塊是否正在變成保留週期嗎?請注意,該塊正在被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。 –

回答

1
  • 該塊是否保留self是的。
  • 請問sampleClass2是否保留該塊?也許吧。這取決於doAnother:方法的作用。沒有代碼,就不可能說。
  • 即使我們假設sampleClass2保留該塊,是否存在保留週期?編號有一個連接sampleClass2 -> the block -> self,但沒有顯示的代碼是從selfsampleClass2的連接。
0

當塊保留在ivar或屬性中時,只能有一個保留週期。我們沒有看到-[SampleClass2 doAnother:]與塊做什麼,所以我們不知道。

該塊通過引用ivar _array隱式捕獲self,所以有可能形成參考循環。這取決於誰保留SampleClass1實例以及SampleClass2如何處理該塊。

+1

無論你在一個塊內做什麼都不會影響塊之外的保留週期。保留週期的唯一情況是當您保留塊本身時,例如:[self block:^(id smth){ [self function];你也可以說「有機會」 - 要麼有保留週期,要麼沒有:) }]; –

+1

@GrzegorzKrukowski如果'doAnother:'方法結束保留塊,那麼將會有一個參考週期。 – rmaddy

+1

並非如此 - 如果SampleClass2保留(複製)一個塊,它將在釋放對象之後釋放它 - 並且塊本身不會在任何地方保留SampleClass2。 –