objective-c – bridged cast:__bridge_transfer vs __bridge with synthetic setter

我正在使用ARC,并在使用__bridge_transfer时混淆.我有一个属性userName如下:
@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);

人的类型是ABRecordRef.

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

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

解决方法

当您调用ABRecordCopycompositeName()时,某些人必须释放返回的对象.使用__bridge_transfer确保ARC将为您释放对象.没有__bridge_transfer,您必须手动释放返回的对象.那是唯一的两个选择.

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

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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...