在block间传递c结构体指针地址

背景

有这样一个函数,它分配空间并把地址传递到指针内容中


void foo(MyStruct **myStruct) {
  //malloc
  // (*myStruct) = balabla
}

在Objective-C 中

如果我们在block外面声明MyStruct, 然后在block 中调用foo 办法, 系统将会提示找不到foo函数


MyStruct *myStruct = NULL;
dispatch_async(dispatch_get_main_queue(), ^{
    foo(&myStruct)
});

原因很简单, 在block传递到dispatch_async时, block 会拷贝到堆上, 由于block引用了外部变量, myStruct会被struct 包装一下, 所以在&myStruct并不是MyStruct 的 **类型

解决方法

MyStruct *myStruct = NULL;
dispatch_async(dispatch_get_main_queue(), ^{
    MyStruct *myStructTmp = myStruct;
    foo(&myStructTmp);
});

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 1,771评论 0 4
  • 多线程、特别是NSOperation 和 GCD 的内部原理。运行时机制的原理和运用场景。SDWebImage的原...
    LZM轮回阅读 2,046评论 0 12
  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 2,471评论 0 35
  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 2,028评论 0 7
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,412评论 0 6