在块中使用self传递给c函数而不使用上下文参数

时间:2013-10-31 13:17:48

标签: objective-c c block self dylib

当我们使用GCD的dispatch_async功能时,我们可以执行以下操作:

- (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时,[self anOtherMethod];有时会出现奇怪的BAD_EXC错误。有时,它会在_dispatch_client_callout(libdispatch的函数部分,由GCD使用)内崩溃,有时我会得到一个选择器无法识别的错误。

如果我将self传递给context参数,则可以正常使用。但是,与在上面显示的self内使用dispatch_async相比,我能做些什么?

0 个答案:

没有答案