1

我有一个包含核心基础对象的属性,特别是 CFHTTPMessageRef。我尝试使用属性((NSObject)) 宏来告诉编译器将引用的对象视为普通的 NSObject 并为我处理该对象的保留和释放,而不必自己 CFRelease。我尝试将属性更改为弱而不是强,但似乎没有任何效果,静态分析器仍然告诉我有内存泄漏,从 CFGetRetainCount 的输出来看,它是正确的。有谁知道为什么我的财产会导致内存泄漏:

typedef __attribute__((NSObject)) CFHTTPMessageRef HTTPMessageRef;

@interface ABRemoteConnection : NSObject
@property (strong) HTTPMessageRef message;
@end

- (void)dataReceived:(NSNotification *)notification {
    self.message = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, TRUE);

    // do some stuff and if the message is complete, use it and release the 
    // message object
    if (messageIsComplete(self.message)) {
         self.message = NULL;
    }
}
4

1 回答 1

1

文档来看,它看起来__attribute__((NSObject))只适用于retain.

但是切换strongretain意味着您现在正在添加另一个 ref,该道具将为您管理;还有你必须的原始参考CFRelease

如果你仔细想想,这是有道理的。想象一下用 a 做同样的事情property(retain) NSObject *

- (void)dataReceived:(NSNotification *)notification {
    self.o = [[NSObject alloc] init];
}

这很好用——但只是因为 ARC 看到并在范围的末尾alloc自动为您插入对应的。release使用一个CF___Create函数,在作用域的末尾没有自动的 CFRelease,所以你必须手动编写一个。

如果你真的想像HTTPMessageRef一样方便NSDictionary,它不能只是一个 typedef;它必须是免费的桥接课程。

于 2012-11-03T00:34:25.137 回答