桥接演员:__bridge_transfer vs __bridge与合成的二传手 [英] bridged cast: __bridge_transfer vs __bridge with synthesized setter

查看:94
本文介绍了桥接演员:__bridge_transfer vs __bridge与合成的二传手的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用ARC,并且在使用__bridge_transfer时感到困惑.我有一个属性userName如下:

I am using ARC, and have confusion while using __bridge_transfer. I have a property userName as following:

@property (nonatomic, retain) NSString *userName;
...
@synthesize userName = _userName;
...

案例 1 :

NSString *name = (__bridge_transfer NSString *)ABRecordCopyCompositeName(person);
self.userName = name;

案例 2 :

self.userName = (__bridge_transfer NSString *)ABRecordCopyCompositeName(person);

其中personABRecordRef类型.

在CASE 1 中,ARC将释放局部变量名称(根据我的理解,如果我错了,请更正我),但是在CASE 2 中会发生什么?我应该在CASE 2 中使用__bridge还是根本不使用CASE 2 ?在CASE 2 __bridge_transfer__bridge中,如何平衡引用计数?

In CASE 1, ARC would release local variable name (as per my understanding, correct me if I am wrong), however what would happen in CASE 2 ? Should I use __bridge in CASE 2 OR CASE 2 should not be used at all ? in CASE 2 with __bridge_transfer or __bridge, how to balance the reference count ?

,ARC会释放对象(该对象作为参数传递给setter (void)setUserName:(NSString *)userName的对象)吗?

in CASE 2, with __bridge_transfer, will ARC release the object (the object, which is being passed as an argument to the setter (void)setUserName:(NSString *)userName)?

推荐答案

调用ABRecordCopyCompositeName()时,某人必须在某个时候释放返回的对象.使用__bridge_transfer确保ARC将为您释放对象.如果没有__bridge_transfer,则必须手动释放返回的对象.那是仅有的两个选择.

When you call ABRecordCopyCompositeName(), someone must release the returned object at some point. Using __bridge_transfer ensures that ARC will release the object for you. Without __bridge_transfer, you must release the returned object manually. Those are the only two options.

因此,在两种情况下都必须使用__bridge_transfer.

Therefore, you must use __bridge_transfer in both cases.

一个不错的练习是使用__bridge而不是__bridge_transfer引起泄漏,然后使用Xcode和Instruments尝试查找泄漏.编译器会吸收泄漏吗?静态分析(Project-> Analyze)是否可以解决泄漏问题?仪器会吸收泄漏吗?如果是这样,您将知道如何检查__bridge_transfer是否解决了问题.

A nice exercise is to induce a leak by using __bridge instead of __bridge_transfer, then use Xcode and Instruments to try and find the leak. Does the compiler pick up the leak? Does static analysis (Project -> Analyze) pick up the leak? Does Instruments pick up the leak? If so, you'll then know how to check whether __bridge_transfer solves the problem.

这篇关于桥接演员:__bridge_transfer vs __bridge与合成的二传手的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆