gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:30:28 24 4
gpt4 key购买 nike

我是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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com