混合GCD和pThread会导致奇怪的效果

时间:2015-02-24 22:26:53

标签: ios objective-c

我已经下载了一个我想要使用的多平台库。在构建纯C命令行应用程序时,库可以正常工作。有一些印刷品可以显示出我的预期。

我从iOS Objective-C这样称呼它:

dispatch_async() { 
     callbackFunctPtr =  myCallBackFunction; 
     LibrariesRunLoopFunction(); 
}

库已经关闭并且会在C代码中执行导致pthread_create()的内容,然后调用类似这样的内容:

void myCallBackFunction(char *text)
{

    NSLog( @"%s", __PRETTY_FUNCTION__ ); 
    dispatch_async( dispatch_get_main_queue(), ^{
      // This line seems to get called sometimes once, sometimes many times.
      [myViewControllerPtr updateUITextViewWith:text];  
    }

}

我可以做的事情;我的头脑是[myViewControllerPtr updateUITextViewWith:text];似乎有时会被召唤一次,但往往会被召唤几次,有时还会被破坏。

1 个答案:

答案 0 :(得分:1)

在跨线程传递char * C字符串时,内存管理几乎是不可能的。您不知道是谁创建了内存,并且您不知道接收器何时完成它以便您可以释放它。

我的猜测是传递给myCallBackFunction的char *文本仅在调用期间有效,并在函数返回后立即释放。 (它可能分配了malloc(),并通过调用free()发布。)

您需要提出一些方法来管理不同线程之间的内存。

一种方法是在回调函数中复制字符串,然后在完成后从主线程中释放它:

void myCallBackFunction(char *text)
{
    //Create a block of memory for the string copy (plus 1 for the null)
    char *newText = malloc(strlen(text)+1);

    //Copy the string to the newly allocated buffer.
    strcpy(newText, text);
    NSLog( @"%s", __PRETTY_FUNCTION__ ); 
    dispatch_async( dispatch_get_main_queue(), ^{
      // This line seems to get called sometimes once, sometimes many times.
      [myViewControllerPtr updateUITextViewWith:newText];
      //free the text buffer once the view controller is done with it.
      free(newText);
    }
}