我是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:@""]];
}
突出的问题是:
我该如何解决?
我正在使用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/