为什么我有可能的保留周期警告

时间:2012-04-24 08:32:46

标签: objective-c ios block

我在.h

中声明了以下块
@property (strong, nonatomic) void(^setHandedness)(BOOL hand);

它在匹配的.m

中定义
 setHandedness = ^(BOOL hand){
    _isRightHanded = hand;
};

并传递给子视图控制器,该控制器具有相同形式的块声明。除了弱势

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

用弱代替强删除警告。但我不明白为什么?

然后在子视图控制器中调用该块

setHandedness(handedness);

我有警告告诉我自己可能会导致保留周期?有任何想法吗。欢呼声。

2 个答案:

答案 0 :(得分:4)

警告的原因是:

  1. 您的对象会在该属性中保留该块。
  2. 您的块会保留您的对象,因为它会访问实例变量。
  3. 现在您有两个彼此引用的对象。即使没有其他人引用它们,它们也会保持对方活着,永远不会被解除分配。

    以下是Apple's documentation for blocks and variables

    的引用
      

    如果通过引用访问实例变量,则保留self;

    您的第二个视图控制器与您的保留周期无关。

答案 1 :(得分:1)

你有一个可能的保留周期,因为通常的情况是,当父指向具有强指针的子节点,并且子节点指向具有另一个强指针的父节点时,它们将保持活着并且永远不会被处理(这就是ARC的工作方式)。当您将子指针替换为弱指针时,这不会发生。