当我尝试使用__attribute __((NSObject))时,为什么Xcode 4.5静态分析器告诉我有潜在的内存泄漏

时间:2012-11-02 23:10:37

标签: objective-c xcode4.5 core-foundation

我有一个包含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;
    }
}

1 个答案:

答案 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,因此您必须手动编写一个。

如果你真的希望HTTPMessageRefNSDictionary一样方便,那么它不能只是一个typedef;它必须是一个免费的桥接课程。