[英]Why does the Xcode 4.5 static analyzer tell me that I have a potential memory leak when I try to use __attribute__((NSObject))
我有一個包含Core Foundation對象的屬性,特別是CFHTTPMessageRef。 我嘗試使用屬性 ((NSObject))宏來告訴編譯器將引用的對象視為普通的NSObject並為我處理該對象的保留和釋放,而不必CFR釋放自己。 我嘗試將屬性更改為弱而不是強,但是似乎沒有任何效果,靜態分析器仍然告訴我我發生了內存泄漏,從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;
}
}
從文檔中可以看出, __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; 它必須是免費的橋接課程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.