在块内使用 __block 变量

时间:2021-07-03 20:13:03

标签: objective-c++

我有一堂这样的课

class MyClass{
public:
    MyClass(const int *a, int *aC= nullptr);
    MyClass(MyClass &myClass) = delete;

    MyClass(MyClass &&yClass) noexcept;
}

我的处理器函数是这样定义的

my_processor = ^(int* c1, const int* a1){
  __block MyClass obj(a1 c1);

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void)
  {                
     ProcessMyData(obj);
  });

}

当我运行代码时,我遇到了这样的崩溃

0   libsystem_platform.dylib        0x00007fff20359029 _platform_memmove$VARIANT$Haswell + 41
1   libsystem_blocks.dylib          0x00007fff2004f3d1 _Block_copy + 117

我做错了什么?

1 个答案:

答案 0 :(得分:0)

鉴于您提供的代码,我认为我们无法最终找到问题的根源,因为它不足以重现问题。

对我来说最明显的可能性是:

my_processor = ^(int* c1, const int* a1){
  __block MyClass obj(a1 c1);

 dispatch_async(

这里,c1a1 是指针。我假设与您发布的代码不同,构造函数的这些参数以某种方式影响构造对象的状态。它们的生命周期对对象的内部状态有影响吗?换句话说,其中一个指针是否存储在对象中,以后会被取消引用吗?传递给 dispatch_async() 的块很可能在不同的线程上在不确定的时间点被调用。

因此,如果任何一个指针存储在 MyClass 中,它们必须保持有效,直到保证异步分派完成。 (如果难以保证,请考虑复制数据而不是存储指针。)

了解崩溃的确切时间可能也有帮助。您还可以明确 _Block_copy 用于诊断目的,而不是让它按需发生,以查看是否也会引发崩溃。

但本质上,您在这里没有提供足够的上下文来给出任何接近明确答案的内容。编辑您的问题,以便代码可以运行并显示崩溃,我们可以为您提供帮助。

相关问题