2012-04-24 48 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

相关问题