引用计数对象在发布警告后使用

时间:2013-02-25 13:39:31

标签: objective-c xcode cocoa

我收到以下代码的警告:

NSString *userMail = (__bridge NSString *) contactInfo;
CFRelease(contactInfo);

// Persist the user mail in NSUserDefaults
[[SettingsHelper sharedInstance] setUserMail:userMail];

我发布contactInfo之后我不再引用它了,所以我真的不明白这个警告。

2 个答案:

答案 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假定的指针保留在其他位置。

备选方案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 *