objective-c - 引用计数对象在释放后使用警告

标签 objective-c xcode cocoa

我收到以下代码的警告:

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/

相关文章:

ios - 在 iOS 应用内购买中恢复购买

ios - Swift 项目中的 Swift Pod

xcode - Git 提交, `no such file or directory`?

macos - 如何修改 NSButton 的外观以创建切换效果

objective-c - 如何使用 Cocoa 应用程序读取 Safari Cookie?

objective-c - 无法使用 GNUstep 在 Objective-C 上构建程序

objective-c - Xcode 8 中的自动完成速度慢

objective-c - 应用程序重新打开事件 - Cocoa/Objective C

iphone - 如何创建一个 iPhone 应用程序来拍照并将其发送回 Oracle 数据库?

xcode - 命令行工具核心数据教程