0

当我们使用dispatch_asyncGCD 的功能时,我们可以做到以下几点:

- (void)aMethod {

  dispatch_async(dispatch_get_concurrent_queue(0, 0), ^{

   [self anOtherMethod];
   self.aProperty = @"Hello";
  });

我们可以在这里看到,我们可以self在块内使用和属性传递给 C 函数,而无需任何上下文参数。

我在 C 和 CoreFoundation 中创建了一个动态库(链接到 CoreFoundation 和 IOKit 框架),我使用如下:

- (void)aMethod {

  MyCFunctionFromDylib(NULL, ^(void *context){
    // the first argument is the context, NULL here
    [self anOtherMethod];
  });
}

- (void)anOtherMethod {

  [[NSNotificationCenter defaultCenter] postNotificationName:@"NotificationName" object:self];
}

该块由执行dispatch_async

void MyCFuntionFromDylib(void *context, void (^the_block)(void* context) ) { 

  dispatch_async(dispatch_get_concurrent_queue(0,0), ^{
     the_block(context);
  });

在这里,它不起作用。我的应用程序因一些不同的错误而崩溃。有时执行CFBasicHashFindBucket时会出现奇怪的 BAD_EXC 错误[self anOtherMethod];。有时,它在内部崩溃_dispatch_client_callout(libdispatch 的函数部分,由 GCD 使用),有时我得到一个选择器无法识别的错误。

如果我传递selfcontext参数,它工作正常。但是,我能做些什么来获得与使用selfinside相同的行为dispatch_async,如上所示?

4

0 回答 0