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

Neo*_*Neo 1 objective-c ios

我是Objective-C的新手.XCode突出显示以下代码作为问题. _myCookies是我班级的私有变量,我存储收到的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:@""]];

}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

突出的问题是:

  1. 调用函数'CFHTTPMessageCopyAllHeaderFields'返回一个带有+1保留计数的Core Foundation对象
  2. 泄漏的对象:分配并存储到'responseHeaders'中的对象稍后在此执行路径中未引用,并且保留计数为+1

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

Gre*_*reg 5

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

NSDictionary *responseHeaders = CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(socket.HTTPHeaders));
Run Code Online (Sandbox Code Playgroud)

CF对象不由ARC管理,必须手动释放.当您使用__bridge强制转换时,您只需直接投射对象而不会更改所有权.这是导致内存泄漏的原因(您需要CFRelease在完成CF对象时手动释放它们).

只需使用CFBridgingRelease转换对象就可以避免所有这些手动内存管理问题(如上面的代码示例所示).这会将CF对象的所有权转移给ARC,因此ARC会自动为您释放该对象,一切都会正常工作,您无需额外的工作.