2012-12-11 86 views
-4

雖然啓用了自動引用計數,但我收到內存泄漏。iphone - 內存泄漏盡管ARC

我做調試的一點點,發現那位指出,當應用程序獲取此輸出的問題: *** error: can't allocate region*** set a breakpoint in malloc_error_break to debug

我跟蹤它到了這一點:

if (currentTime < 60) { 
    currentTimeMin = 0; 
    ct.text = [NSString stringWithFormat:@"%i:%i", currentTimeMin, currentTime]; 
} 
if (currentTime >= 60) { 
    currentTimeMin = 1; 
    ct.text = [NSString stringWithFormat:@"%i:%i", currentTimeMin, currentTime -60]; 
} 
if (currentTime >= 120) { 
    currentTimeMin = 2; 
    ct.text = [NSString stringWithFormat:@"%i:%i", currentTimeMin, currentTime -120]; 
} 
if (currentTime >= 180) { 
    currentTimeMin = 3; 
    ct.text = [NSString stringWithFormat:@"%i:%i", currentTimeMin, currentTime -180]; 
} 
if (currentTime >= 240) { 
    currentTimeMin = 4; 
    ct.text = [NSString stringWithFormat:@"%i:%i", currentTimeMin, currentTime -240]; 
} 
if (totalTime < 60) { 
    totalTimeMin = 0; 
    tt.text = [NSString stringWithFormat:@"%i:%i", totalTimeMin, totalTime]; 
} 
if (totalTime >= 60) { 
    totalTimeMin = 1; 
    tt.text = [NSString stringWithFormat:@"%i:%i", totalTimeMin, totalTime -60]; 
} 
if (totalTime >= 120) { 
    totalTimeMin = 2; 
    tt.text = [NSString stringWithFormat:@"%i:%i", totalTimeMin, totalTime -120]; 
} 
if (totalTime >= 180) { 
    totalTimeMin = 3; 
    tt.text = [NSString stringWithFormat:@"%i:%i", totalTimeMin, totalTime -180]; 
} 
if (totalTime >= 240) { 
    totalTimeMin = 4; 
    tt.text = [NSString stringWithFormat:@"%i:%i", totalTimeMin, totalTime -240]; 
} 

我認爲這個問題是與標籤:ct和tt,但我不知道,似乎無法弄清楚爲什麼。一切都很完美,直到一天前我用UITableVIews進行了一些嘗試。

此致敬禮! Martin

+2

您是否嘗試添加'malloc_error_break'斷點的建議? – rmaddy

+0

您正在設置相同的文本4次。有什麼理由呢? –

+0

stringWithFormat本身並不會產生問題。雖然可能是你已經拋棄了堆,而stringWithFormat是被發現的地方。 –

回答

3

此代碼是否在循環中?如果是這樣,你需要把你的代碼放到一個自動釋放池中。

while(someStuff) { 
    @autoreleasepool { 
     //Your code here 
    } 
} 
+0

爲什麼你需要使用顯式的自動釋放池?由於正在創建的字符串對象的數量?默認情況下,它們全部放置在主應用程序池中。當然,他們可能會持續比預期的更長的時間,因爲每次通過循環都不會排出池,但它們不會顯示爲泄漏,對嗎? – Metabble

+0

@Metabble如果您在循環中創建足夠多的自動釋放對象,則在釋放自動釋放對象之前,您的應用可能會耗盡內存。通過在循環中使用這樣的顯式自動釋放池,可以確保這不是問題。這是適當的前ARC和ARC。對象沒有泄漏,但沒有循環中的自動釋放池,他們只是繼續建立起來,因爲循環阻止了它們被及時清理。 – rmaddy

+0

@rmaddy謝謝你試圖解釋。我沒有解釋得很好。我意識到在循環中使用autorelease池的好處;而不是讓所有的自動釋放對象在最後釋放,而是在循環的每次迭代結束時釋放它們。我在說,雖然這可能會提高效率,但它不會阻止內存泄漏,因此不是答案;它應該是一個評論。他問爲什麼他會得到內存泄漏,而不是如何在循環內部使用autorelease池來提高效率。它只是讓我困惑。 – Metabble

0

這段代碼不應該導致泄漏。你的錯誤在別處。啓用後衛malloc並閱讀關於調試和分析目標-c。