__bridge_transfer其实是release

本文深入分析了Objective-C中__bridge与__bridge_transfer的使用方式及其对内存管理的影响,通过具体代码示例,阐述了它们在对象赋值和所有权转移过程中的区别和作用。

最近项目中遇到了一些崩溃的情况,发现主要是对象多次释放,所以借此机会讨论一下__bridge 和 __bridge_transfer


先看一下下面的代码

{
        CFMutableStringRef str = CFStringCreateMutableCopy(NULL,1000,CFSTR("Hello World") );
        __strong NSMutableString *value = (__bridge NSMutableString *)str ;
        CFRelease(str) ;
        [value appendString:@"hi"] ;
        NSLog(@"%@", value) ;
}


使用__bridge编译器没有做什么操作,不过因为value是强引用,value还是会在赋值的时候retain一下,然后在value的作用域结束后release,所以这段代码没有问题


再说说__bridge_transfer

{
        CFMutableStringRef str = CFStringCreateMutableCopy(NULL,1000,CFSTR("Hello World") );
        __strong NSMutableString *value = (__bridge_transfer NSMutableString *)str ;
        
        [value appendString:@"hi"] ;
        NSLog(@"%@", value) ;
}

这段代码不会有内存泄露,那么编译器做了什么呢?我们看一下__bridge_transfer的另一种写法 

CFBridgingRelease(str),从这个名字中可以看出,编译器会在transfer ownership的时候用CFRelease(str)释放掉str,因为value是强引用的,retain一下,所以对象也不会被释放,直到value离开它的作用域。


请看链接:

http://stackoverflow.com/questions/25859098/when-using-bridge-will-the-object-c-object-changed-to-unsafe-unretained-i


int kdrv_bridge_map(void) { u32 bridge[2] = {0}; const char path[] = "/nvt_memory_cfg/bridge"; struct device_node* of_node = of_find_node_by_path(path); if (!kdrv_builtin_is_fastboot()) { pr_err("unable to map bridge without fastboot mode\n"); return 0; } if (mp_bridge) { pr_err("bridge has mapped\n"); return 0; } if (!of_node) { pr_err("unable to find %s\n", path); return -1; } if (of_property_read_u32_array(of_node, "reg", bridge, 2) != 0) { pr_err("unable to read %s/reg\n", path); return -1; } mp_bridge = (BRIDGE_DESC *)ioremap_cache(bridge[0], bridge[1]); if (mp_bridge->bridge_fourcc != BRIDGE_FOURCC) { pr_err("invalid bridge_fourcc\n"); iounmap((void *)mp_bridge); mp_bridge = NULL; return -1; } if (mp_bridge->bridge_size != sizeof(BRIDGE_DESC)) { pr_err("bridge_size not matched\n"); iounmap((void *)mp_bridge); mp_bridge = NULL; return -1; } return 0; } if (kdrv_builtin_is_fastboot()) { unsigned int take_over = 1; kdrv_bridge_map(); //map bridge memory for all built-in kdrv_fdt_map(); if (kdrv_bridge_set_tag(AMP_TAKEOVER_FROM_RTOS, take_over) == 0) { while (take_over) { if (kdrv_bridge_get_tag(AMP_TAKEOVER_FROM_RTOS, &take_over) != 0) { DBG_ERR("failed to get take over status-2.\n"); break; } } } else { DBG_ERR("failed to get take over status-1.\n"); } kdrv_builtin_ts_add_from_bridge("linux_go", TS_LINUX_GO); kdrv_builtin_ts_add_from_bridge("rtos_ipp1", TS_IPP_PLAN_1); kdrv_builtin_ts_add_from_bridge("rtos_ipp2", TS_IPP_PLAN_2); kdrv_builtin_ts_add_from_bridge("rtos_ipp3", TS_IPP_PLAN_3); kdrv_builtin_ts_add_from_bridge("rtos_ipp4", TS_IPP_PLAN_4); kdrv_builtin_ts_add_from_bridge("rtos_venc1", TS_VENC_PLAN_1); kdrv_builtin_ts_add_from_bridge("rtos_sie1", TS_SIE_PLAN_1); kdrv_builtin_ts_add("handshake_done"); } NT98538A的HDAL驱动源码中,以上代码功能是什么?详细介绍工作流程。
最新发布
10-30
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值