1

我在 .h 中声明了以下块

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

它在匹配的 .m 中定义

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

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

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

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

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

setHandedness(handedness);

我有一个警告告诉我 self 可能会导致保留周期?有任何想法吗。干杯。

4

2 回答 2

4

警告的原因是这样的:

  1. 您的对象保留属性中的块。
  2. 您的块保留您的对象,因为它访问实例变量。

现在你有两个相互引用的对象。即使没有其他人引用它们,它们也会使彼此保持活力并且永远不会被释放。

这是Apple 文档中关于块和变量的引用

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

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

于 2012-04-24T09:06:13.023 回答
1

您有一个可能的保留周期,因为通常情况下,当父级使用强指针指向子级,而子级使用另一个强指针指向父级时,它们将保持活动状态并且永远不会被释放(这就是ARC 有效)。当您将子指针替换为弱指针时,就不会发生这种情况。

于 2012-04-24T09:04:02.543 回答