我收到以下代码的警告:
NSString *userMail = (__bridge NSString *) contactInfo;
CFRelease(contactInfo);
// Persist the user mail in NSUserDefaults
[[SettingsHelper sharedInstance] setUserMail:userMail];
释放
contactInfo
之后,我不再引用它,因此我不太理解警告。 最佳答案
桥接转换将某些内容传入或传出ARC控制,但它为您提供了ARC假定保留在其他位置的指针。
备选案文1(丑陋)
如果使用普通的__bridge
,则必须先完成处理,然后才能释放该对象。
NSString *userMail = (__bridge NSString *) contactInfo;
[[SettingsHelper sharedInstance] setUserMail:userMail];
CFRelease(contactInfo);
备选方案2(不错)
如果使用
__bridge_transfer
,ARC将为您跟踪。NSString *userMail = (__bridge_transfer NSString *) contactInfo;
[[SettingsHelper sharedInstance] setUserMail:userMail];
摘要
__bridge
强制转换只能用于将引用计数类型转换为非引用计数类型。例如,在void *
和NSString *
之间。例如,您需要使用它编写C语言中的回调函数。__bridge_transfer
强制转换可让您从一种引用计数类型转换为另一种,例如CFStringRef
到NSString *
。