当我们使用dispatch_async
GCD 的功能时,我们可以做到以下几点:
- (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 使用),有时我得到一个选择器无法识别的错误。
如果我传递self
给context
参数,它工作正常。但是,我能做些什么来获得与使用self
inside相同的行为dispatch_async
,如上所示?