簡體   English   中英

為什么Xcode 4.5靜態分析器告訴我在嘗試使用__attribute __((NSObject))時存在潛在的內存泄漏

[英]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一起使用。

但是切換strongretain意味着你現在加入另一個參考該道具將會為您管理; 仍然有您必須CFRelease的原始裁判。

如果您考慮一下,這是有道理的。 想象一下使用property(retain) NSObject *做同樣的事情:

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

這可以很好地工作,但這只是因為ARC可以看到alloc並在作用域的結尾自動為您插入相應的release 使用CF___Create函數,作用域末尾沒有自動CFRelease,因此您必須手動編寫一個。

如果您確實希望HTTPMessageRefNSDictionary這樣方便,那么它就不能只是typedef; 它必須是免費的橋接課程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM