当我们使用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
相比,我能做些什么?