__bridge、__bridge_retain、__bridg
这三个字段除了__bridge之外,其它两个字段并不常用,网上关于它的讲解很多,但是都是含糊其词,重要的地方一带而过,让我一直云山雾绕,我也一直很纳闷为什么没有一个人能明明白白的讲清楚到底什么场景会用到他们,所以咱亲自测试一下他们有什么不同。
1.__bridge
__bridge是我们最常用的了,根据编译器提示,完整的写法是(__bridge type)expression
,
type: type可以是void *, 也可以是id ,所以既可以把id类型转化成void *指针,也可以void *转id .
void * <--------> id
引用计数影响:无影响,对象的引用计数不发生任何改变。
应用场景:void *指针指向的对象不能随后被释放,否则会崩溃!!!所以void *指针要立即使用,如果你要保存这个void 指针留着以后使用,那么不要使用bridge修饰 (要用下面讲的__bridge_retain*)!!
2.__bridge_retain
完整写法是:(__bridge_retain CFType)expression
type: type是CFType,可以理解为void *.所以只适用于id转化成void *, 否则编译不通过
id -> void*
引用计数影响:有影响,对象的引用计数+1!
应用场景:想要保存这个void 指针留着以后使用,请使用__bridge_retain*修饰 ,防止对象中间被释放!
2.__bridge_transfer
完整写法是:(__bridge_transfer objectC type)expression
type: type是id.所以只适用于void *转化成id, 否则编译不通过
void * -> id
引用计数影响:有影响,对象的引用计数-1, void *指针被收回了所有权!!但是transfer转移到新的对象,此时引用计数又+1
应用场景:不想让void*指针影响干扰对象的引用计数,void*指针已经没有作用的时候使用!
结语
可以发现__brdge_retain与__bridge_transfer正好是一对相反的操作!不过还有一个疑问:是否他们一定要成对出现?如果不用__bridge_transfer会不会导致对象无法被释放?