将局部变量作为块内的方法参数传递是否安全?

Is it safe to pass local variables as method parameters inside of a block?

我知道 Obj-C 中的块允许您引用局部变量,这很好。但是我们可以安全地将局部变量从块内部传递给另一个方法吗?

我知道从块内部引用 self 可能很危险,但这是否扩展到任何其他变量。

示例:

-(void)methodTakesObject(ObjectA *)object {

    ObjectB *b = object.b;
    __weak MyObject *weakSelf = self;

    [b doInBackground:^(NSArray *results) {
         [weakSelf doSomethingElseWith:results andWith:object andEvenWith:b];
    }
}

这里有三个"types"局部变量。来自块的 results,在方法内部创建的 ObjectB,以及传递给方法以启动的 ObjectA

我是否应该担心使用这些变量中的任何一个,实际上在块

中如何处理这些变量之间是否存在任何difference/concerns

其实,不管涉及到什么变量,都没有区别

保留周期的问题是,如果一个对象持有对块的强引用它不会被释放,直到它被释放而该块持有强引用引用同一对象。这不会发生在这里。

一个名为 -doInBackground: 的方法似乎会 运行 块(立即开始),然后在完成时释放块。因此,只要某个其他对象存在,就不可能保留该块,因此也不可能永远保留该其他对象。

您甚至不需要使用弱自我约定来避免此处的保留循环。你只会在不太可能的情况下使用它,你真的希望允许 self 有时在块调用它的方法之前被释放。更有可能的是,您应该只使用对 self 的正常强引用,因为正常 and/or 希望 self 能够存活足够长的时间以执行块。

如果你担心保留周期,@ken给了你完美的答案。至于对变量的关注:

  1. object 从调用的方法中保留 methodTakesObject: 所以你不用担心。 (如果不是 nil,那么)。
  2. b也被你保留了,引用计数很可能是2或者 更多,所以你也不必担心。

换句话说,你是安全的。