我收到以下代码的警告:
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 *
。
关于objective-c - 引用计数对象在释放后使用警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15068319/