桥接演员:__ bridge_transfer vs __bridge with synthesis setter

Vas*_*asu 10 objective-c automatic-ref-counting

我正在使用ARC,并且在使用时会产生混淆__bridge_transfer.我有一个属性userName如下:

@property (nonatomic, retain) NSString *userName;
...
@synthesize userName = _userName;
...
Run Code Online (Sandbox Code Playgroud)

案例1:

NSString *name = (__bridge_transfer NSString *)ABRecordCopyCompositeName(person);
self.userName = name;
Run Code Online (Sandbox Code Playgroud)

案例2:

self.userName = (__bridge_transfer NSString *)ABRecordCopyCompositeName(person);
Run Code Online (Sandbox Code Playgroud)

哪里person是类型ABRecordRef.

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

在CASE 2中,__bridge_transfer将ARC释放对象(该对象,它作为参数传递给setter (void)setUserName:(NSString *)userName)?

Dar*_*ren 21

当你打电话时ABRecordCopyCompositeName(),某人必须在某个时候释放返回的对象.使用__bridge_transfer确保ARC将为您释放对象.如果没有__bridge_transfer,则必须手动释放返回的对象.这是唯一的两个选择.

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

一个很好的练习是通过使用__bridge而不是__bridge_transfer使用Xcode和Instruments来尝试找到泄漏来引发泄漏.编译器是否收到泄漏?静态分析(项目 - >分析)是否会发现泄漏?仪器是否会发现泄漏?如果是这样,您将知道如何检查是否__bridge_transfer解决了问题.