2012-04-24 92 views
1

我有以下塊爲什麼我有一個可能的保留週期警告

@property (strong, nonatomic) void(^setHandedness)(BOOL hand); 

它在匹配的.m

setHandedness = ^(BOOL hand){ 
    _isRightHanded = hand; 
}; 

定義,是一個.H聲明傳遞給孩子視圖控制器具有相同形式的聲明塊。除弱以外

@property (weak, nonatomic) void(^setHandedness)(BOOL hand); 

強弱取代消除警告。但我不明白爲什麼?

塊,然後調用在子視圖控制器

setHandedness(handedness); 

我有一個警告信息,告訴我自己很可能造成一個保留循環?有任何想法嗎。乾杯。

+1

嘗試在兩個都很弱,它應該去... – 2012-04-24 08:56:35

+0

謝謝,這是行不通的,但如果他們都弱,塊是一個對象被保留在哪裏? – geminiCoder 2012-04-24 09:01:32

回答

4

的原因警告是這樣的:

  1. 你的對象將保留在屬性塊。
  2. 您的塊保留您的對象,因爲它訪問實例變量。

現在你有兩個彼此相互引用的對象。即使沒有其他人引用它們,它們也會保持彼此的活力,永遠不會被釋放。

這裏是Apple's documentation for blocks and variables

報價如果您通過引用來訪問實例變量,自被保留;

您的第二個視圖控制器與您的保留週期無關。

+0

謝謝你清理那個,現在有道理。乾杯 – geminiCoder 2012-04-24 09:09:26

1

你有一個可能的保留循環,因爲通常情況下,當父指向具有強指針的孩子,並且孩子用另一個強指針指向父母時,他們會保持自己的活力,並且永遠不會獲得分手(即ARC如何工作)。當你替換弱指針的子指針時,這不會發生。

+0

是的,我同意。但是我原本讓孩子使用虛弱,只有使用強壯的患者,現在他們都變得虛弱,誰保留下來? – geminiCoder 2012-04-24 09:05:45

相關問題