我收到以下代码的警告:
NSString *userMail = (__bridge NSString *) contactInfo;
CFRelease(contactInfo);
// Persist the user mail in NSUserDefaults
[[SettingsHelper sharedInstance] setUserMail:userMail];
发布后contactInfo
,我不再引用它,所以我不太理解警告。
我收到以下代码的警告:
NSString *userMail = (__bridge NSString *) contactInfo;
CFRelease(contactInfo);
// Persist the user mail in NSUserDefaults
[[SettingsHelper sharedInstance] setUserMail:userMail];
发布后contactInfo
,我不再引用它,所以我不太理解警告。
userMail 只是对您的contactInfo 对象的引用。调用 userMail 就像调用contactInfo。在这里释放contactInfo,然后尝试将userMail(这是对contactInfo 的引用)设置为settingsHelper 的userMail。
试试这个方法
NSString *userMail = (__bridge NSString *) contactInfo;
// Persist the user mail in NSUserDefaults
[[SettingsHelper sharedInstance] setUserMail:userMail];
CFRelease(contactInfo);
桥接强制转换将某些内容传入或传出 ARC 控制,但它为您提供了一个指针,ARC 假定该指针保留在其他地方。
如果使用 normal __bridge
,则在完成之前无法释放对象。
NSString *userMail = (__bridge NSString *) contactInfo;
[[SettingsHelper sharedInstance] setUserMail:userMail];
CFRelease(contactInfo);
如果您使用__bridge_transfer
,ARC 会为您跟踪它。
NSString *userMail = (__bridge_transfer NSString *) contactInfo;
[[SettingsHelper sharedInstance] setUserMail:userMail];
__bridge
强制转换只能用于将引用计数类型转换为非引用计数类型。例如,介于void *
和之间NSString *
。例如,您需要使用它在 C 中编写回调函数。
强制转换将__bridge_transfer
允许您从一种引用计数类型转换为另一种类型,例如转换CFStringRef
为NSString *
.