本文主要是介绍__bridge 显式转换 id和void *,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最近在做项目优化工作,搭建基于CoreText的富文本引擎,遇到了不少问题,将它们记录下来。后续整理。
写法1:
CTRunDelegateRef delegate = CTRunDelegateCreate(&callbacks, (__bridge void *)imageInfoDict);
写法2:
CTRunDelegateRef delegate = CTRunDelegateCreate(&callbacks, (__bridge_retained void *)imageInfoDict);
imageInfoDict = nil;
写法1是大家通用的常规写法,imageInfoDict创建后,未再做其他操作,但有时,会存在delegate回调 CGFloat widthCallback(void *ref) {}等方法时,ref 已被release 造成野指针问题。
这里采用了写法2 在桥接转换时,做一次retain操作。无需做release操作。
项目紧张,暂时写这些,下面是我整理的相关资料。作为原理性扩展学习。
在ARC 无效时,像以下代码这样将id 变量强制转换void * 变量并不会出问题。
/* ARC 无效 */
id obj = [[NSObject alloc] init];
void *p = obj;
更进一步,将该void * 变量赋值给
这篇关于__bridge 显式转换 id和void *的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!