我已经下载了一个我想要使用的多平台库。在构建纯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];似乎有时会被召唤一次,但往往会被召唤几次,有时还会被破坏。
答案 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);
}
}