将局部变量作为块内的方法参数传递是否安全?
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给了你完美的答案。至于对变量的关注:
object
从调用的方法中保留
methodTakesObject:
所以你不用担心。 (如果不是 nil,那么)。
b
也被你保留了,引用计数很可能是2或者
更多,所以你也不必担心。
换句话说,你是安全的。
我知道 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给了你完美的答案。至于对变量的关注:
object
从调用的方法中保留methodTakesObject:
所以你不用担心。 (如果不是 nil,那么)。b
也被你保留了,引用计数很可能是2或者 更多,所以你也不必担心。
换句话说,你是安全的。