objective-c – bridged cast:__bridge_transfer vs __bridge w
发布时间:2020-12-16 06:02:58 所属栏目:百科 来源:网络整理
导读:我正在使用ARC,并在使用__bridge_transfer时混淆.我有一个属性userName如下: @property (nonatomic,retain) NSString *userName;...@synthesize userName = _userName;... 情况1: NSString *name = (__bridge_transfer NSString *)ABRecordCopyCompositeNa
我正在使用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是否解决了这个问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |