我收到以下代码的警告:
NSString *userMail = (__bridge NSString *) contactInfo;
CFRelease(contactInfo);
// Persist the user mail in NSUserDefaults
[[SettingsHelper sharedInstance] setUserMail:userMail];
我发布contactInfo
之后我不再引用它了,所以我真的不明白这个警告。
答案 0 :(得分:0)
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);
答案 1 :(得分:0)
桥接强制转换会将某些内容传输到ARC控件或从ARC控件中传出,但它会为您提供ARC假定的指针保留在其他位置。
如果使用普通__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 *
。