2011-05-11 288 views
0

我有這個在我的代碼:內存泄漏

NSString *myString = @""; 
.... 

if (...) { 
myString = @" other string"; 
} 
... 
myString = @" an other string "; 

這是一個泄漏,請?

回答

4

對不起,夥計們,但它不是autoreleased。它不泄漏,但它不是自動釋放。這段代碼證明這一點:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
NSString *str1 = @"First one"; // 
NSString *str2 = [NSString stringWithFormat:@"The %dnd", 2]; // this autoreleasing string 
[pool drain]; 

NSLog(@"%@", str1); // All's ok 
NSLog(@"%@", str2); // EXC_BAD_ACCESS 

閱讀有關與@"..."建設創建的字符串在Strings PRogramming Guide

編譯器使得這樣的對象中每一個模組 基礎上 常數獨特的,他們永遠不會釋放, 雖然你可以保留並釋放他們 當你做任何其他對象。

+0

+1:是啊......他們都存儲在一個常量池(不自動發佈的池),如果你檢查它們的保留數,它是整數可以容納的最大值。 – 2011-05-11 12:59:27

2

不,這不是一個泄漏這將是autorelease

+1

你不太對,看看我的答案。 – 5hrp 2011-05-11 12:49:49

+0

是鋒利是正確的......你錯了一點.. – 2011-05-11 12:57:41

1

這是不泄漏。只有在分配內存並且不釋放內存時纔會泄漏內存。

在你的情況下,你創建的是一個自動釋放的對象。他們將在稍後發佈。

+0

不,它不是自動釋放對象 – 5hrp 2011-05-11 12:59:55

1

當您通過使用alloc initnewretainmutablecopy方法分配對象並隨後不釋放它們而獲取對象的所有權時會泄漏內存。然後它會導致泄漏。看看Object Ownership

您擁有您創建的任何對象。

你「創造」使用名稱以「黃金」, 「新」,「複製」,或「mutableCopy」(對於 例如,分配,NEWOBJECT,或 mutableCopy)的方法的對象。

您可以使用retain獲取對象的所有權。

請記住,對象可能有多個所有者。取得對象的所有權 是你說 你需要它保持活着的方式。 (這是更詳細地討論 「存取方法。」)

你必須放棄你自己,當你完成 與他們的對象的所有權。

你通過發送釋放消息 或一個自動釋放消息放棄對象的所有權(自動釋放 被更詳細地 「自動釋放」中討論)。在Cocoa術語中,放棄對象 的所有權因此通常被稱爲 「釋放」對象。

您不得放棄您不屬於自己的物體的所有權。

這主要是以前的政策 規則的隱含推論,作出明確規定。

+1

它不是自動釋放,看我的答案 – 5hrp 2011-05-11 12:50:32