调用dispatch_async时我在代码中遇到问题。我认为这个问题是由于ARC在块中使用之前回收该对象,因为调度它的方法完成了。
- (void) method:(SomeClass *) someClass {
// local variable
NSNumber *someValue = someClass.somePropertyOnManagedObject;
dispatch_async(queue, ^() {
/* call some singleton object passing variable
* when access the variable, reference is nil
*/
[[DashboardFacade sharedInstance] someMethod:someValue];
});
}
在查看了大量文档之后,我总结了
我认为解决方案是使用__block
修饰符,以便ARC保留变量。
我的问题是
__block
会解决问题而不会引入其他问题吗?答案 0 :(得分:0)
以上技术上是否正确,例如使用__block将解决 问题,而不是引入其他问题?
是的,技术上正确,__block
,在ARC上,允许您更改变量(在这种情况下指向它的位置,因为它是NSNumber *
),这是在块上下文之外声明的。
为什么我不能在互联网/谷歌的任何地方找到这个?
我认为问题与代码的这个特定位置无关,而是其他问题。
答案 1 :(得分:0)
someValue
才能为零:
NSNumber *someValue = someClass.somePropertyOnManagedObject;
由于在块内使用这些变量,块会保留块捕获的对象。如果它是自身或来自块可见范围的局部变量并不重要。