0

我想創建一個不可變的字符串。我不與初始化,分配或初始化它新的,但仍然是內存泄漏和它說:「對象類NSCFString的0x234b533自動釋放與地方沒有游泳池 - 剛剛泄露」這裏就是我試圖做內存泄漏問題NSAutoreleaseNoPool()

NSMutableString *srn = [NSMutableString stringwithCString:devSID]; 

// devSID is *char 

這會導致泄漏。我已經試過這也

NSMutableString *srn = [NSMutableString stringwithCString:devSID length:sizeof(devSID)]; 

,但是這也不能正常工作,但是如果我試圖用一個簡單的字符串初始化像這樣

NSMutableString *srn = @"this is my string"; 

它工作,不要有任何想法發生了什麼左右。我沒有使用init或alloc,但仍然存在泄漏。我將不得不如果有人可以幫助我解決這個問題是由您的自動釋放對象引起

問候

Umair

+0

你沒有得到最後一個編譯器警告? – JeremyP 2010-11-30 09:24:04

回答

-1

嘗試是這樣的

[[NSString的stringWithCString: 「你好」]保留];

保留是評估你最初沒有創建對象的對象所有權的方式,所以這擴展了我們每一頁頭與釋放匹配或自動釋放

注意的法則:你必須權衡你的釋放計數如果你保留這個對象。如果你不會釋放保留的對象,那麼你將面臨內存泄漏問題。

8

泄漏,而無需到位自動釋放池來照顧它。這通常發生在通過創建自己的線程或僅使用便捷方法來完成主線程之外的任務時。如果你想使用autorelease功能(這裏使用NSMutableString類的方法暗示),你需要在代碼塊的開頭創建一個自動釋放池,在那裏你將使用它並在最後使用它。換句話說,這些方針的東西:

- (void)myBackgroundThing:(id)whatever 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    NSMutableString *srn = [NSMutableString stringwithCString:devSID]; 

    // etc... 

    [pool release]; 
} 
+2

即使一個*不想使用自動釋放功能,許多Cocoa對象也會在幕後執行,所以爲後臺線程創建池幾乎總是一個好主意。 – 2010-11-30 08:28:11

+2

實際上,在引用計數的環境中,您應該總是爲每個將使用Cocoa的線程創建一個自動釋放池。如果你編寫獨立的命令行工具,你也應該在`main()`中創建一個自動釋放池。 – JeremyP 2010-11-30 09:26:29