桥接演员:__bridge_transfer vs __bridge与合成的二传手 [英] bridged cast: __bridge_transfer vs __bridge with synthesized setter
问题描述
我正在使用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);
其中person
是ABRecordRef
类型.
在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屋!