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);
});
ここでは、うまくいきません。アプリケーションがいくつかの異なるエラーでクラッシュします。を実行すると、奇妙な BAD_EXC エラーが発生することがありCFBasicHashFindBucket
ます[self anOtherMethod];
。内部でクラッシュすることもあり_dispatch_client_callout
(GCD で使用される libdispatch の関数部分)、セレクターが認識されないというエラーが発生することもあります。
パラメータに渡すself
と正常に動作します。しかし、上記のようにinsidecontext
を使用するのと同じ動作をさせるにはどうすればよいでしょうか?self
dispatch_async