0

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を使用するのと同じ動作をさせるにはどうすればよいでしょうか?selfdispatch_async

4

0 に答える 0