我有一个包含Core Foundation对象的属性,特别是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;
}
}
答案 0 :(得分:1)
从the documentation开始,__attribute__((NSObject))
似乎只与retain
一起使用。
但是将strong
切换为retain
意味着您现在正在添加另一个道具,道具将为您管理;你还有CFRelease
的原始参考资料。
如果你考虑一下,这是有道理的。想象一下用property(retain) NSObject *
:
- (void)dataReceived:(NSNotification *)notification {
self.o = [[NSObject alloc] init];
}
这很好 - 但只是因为ARC看到alloc
并在范围的末尾自动为您插入相应的release
。使用CF___Create
函数,在作用域的末尾没有自动CFRelease,因此您必须手动编写一个。
如果你真的希望HTTPMessageRef
和NSDictionary
一样方便,那么它不能只是一个typedef;它必须是一个免费的桥接课程。