2016-09-23 96 views
1

爲什麼這個完成塊被正確地調用?爲什麼正確調用完成塊?

CompletionBlock comp = ^(BOOL enabled) { 
      //enabled is being correctly set 
      NSLog(@"result: %i", enabled); 
}; 

@autoreleasepool { 
    Monitor *monitor = [[Monitor alloc]initWithCompletionBlock:comp]; 
    monitor = nil; 
} 

監視器將開始的NSTimer調用完成塊10秒顯示器實例化後。

顯示器在內部引用了補償(通過@property (nonatomic) CompletionBlock compblock;),但循環引用的組成部分似乎並不存在,因爲沒有任何引用監視器。

這是正常的行爲嗎?這是我能指望的行爲嗎?這對我來說確實沒有意義。

+0

沒有看到Monitor類的實現,我們無法真正給你一個正確的答案。 – rmaddy

回答

2

推測Monitor實例是此處的目標。 NSTimer保留其目標,以避免由於發送消息而導致崩潰。*當前運行循環在計劃時保留計時器。

這是正常行爲,you can rely on it

目標
目的向其發送消息[...]計時器維持強引用target ...

實際上,您必須考慮它,以便您不會在計時器與其目標之間創建保留週期。


* NSTimer早在很長一段時間內自動注入弱引用。

+0

你是對的,Monitor對象是目標。我也在用重複:NO。該文件指出,一旦定時器啓動,它將失效。我猜這意味着選擇器完成後?否則,GC有可能會很快做到這一點。 – user3564870

+1

是的,定時器不會使其自身失效,直到告知它的目標執行選擇器爲止。 –

相關問題