ios - Objective-C:存储到NSDictionary中的对象的潜在泄漏

标签 ios objective-c

我是Objective-C的新手。 XCode将以下代码突出显示为问题。_myCookies是我的 class 的 private 变量,我在其中存储接收到的cookie。

@implementation MessageSender {
  NSArray *_myCookies;
}
...
// Socket open callback
- (void) gotData:(MySocket *) socket {
  NSDictionary *responseHeaders = (__bridge NSDictionary*)CFHTTPMessageCopyAllHeaderFields(socket.HTTPHeaders);
  _myCookies = [NSHTTPCookie cookiesWithResponseHeaderFields:responseHeaders
                                                         forURL:[NSURL URLWithString:@""]];

}

突出的问题是:
  • 调用函数“CFHTTPMessageCopyAllHeaderFields”返回保留计数为+1的Core Foundation对象
  • 对象泄漏:在此执行路径中稍后不引用分配并存储到“responseHeaders”中的对象,并且保留计数为+1

  • 我该如何解决?
    我正在使用ARC。我想将cookie存储在我的类中,以便以后可以在发送请求时使用它们,但是我想让套接字处理它的responseHeaders。

    最佳答案

    您需要将CoreFoundation对象的所有权转移到ARC:

    NSDictionary *responseHeaders = CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(socket.HTTPHeaders));
    

    CF对象不受ARC管理,必须手动释放。当使用__bridge强制转换时,您只是在不更改所有权的情况下直接强制转换对象。这就是导致内存泄漏的原因(完成操作后,需要使用CFRelease手动释放CF对象)。

    您可以通过使用CFBridgingRelease强制转换对象来避免所有这些手动内存管理麻烦(如上面的代码示例中所示)。这样会将CF对象的所有权转移到ARC,因此ARC将自动为您处理释放该对象的过程,并且一切正常,而您无需进行任何额外的工作。

    关于ios - Objective-C:存储到NSDictionary中的对象的潜在泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26188581/

    相关文章:

    iOS Firebase 崩溃报告 - 运行构建脚本时出错

    ios - 滚动到行(位于 :at:animated:) SwiftUI

    ios - 在 Swift 中将 HTML 转换为纯文本

    ios - 特定 View Controller 上的自定义方向

    ios - - 使用 `$(inherited)` 标志,或 - 从目标中删除build设置。 CocoaPod Swift3 pod更新报错

    objective-c - Objective-C 中可为空、__nullable 和 _Nullable 之间的区别

    ios - 检测 iOS 键盘上的 Shift + Enter

    ios - db executeUpdate... 在 FMDB block 中并且没有结束,没有错误

    ios - Objective-C snapchat 如何使图像/视频顶部的文本如此清晰而不是像素化?

    ios - 从 nib 加载的 UITableViewCell 未更新(缓存?)