2012-03-01 78 views
0

我正在申報類型爲NSString的伊娃。要初始化這個伊娃的價值,我使用下面的代碼:stringWithFormat創建保留+1實例嗎?

NSString *myVar; 

-(void)inAnyMethod 
{ 
    myVar = [NSString stringWithFormat:@"%@",theValue]; 
} 

我必須發佈此伊娃嗎?根據我的理解,這不是我的責任。但在大多數情況下,我以這種方式使用的字符串會導致泄漏。

我錯過了什麼?

+1

帶格式的字符串應該返回一個自動釋放的MSString對象。所以它應該稍後在自動發佈池中發佈。靜態分析儀是否說你正在泄漏? – 2012-03-01 18:13:02

+2

是什麼讓你覺得有泄漏? – 2012-03-01 18:35:17

+0

儀器。在我使用的每4個NSString對象的每3箇中,標記了泄漏的百分比。 – NemeSys 2012-03-01 18:49:19

回答

0

除了奧斯卡戈麥斯回答,請注意,當你使用類方法(帶加號的方法,您可以在文檔中找到,並且不包括在奧斯卡戈麥斯列表,如stringWithFormat就是其中之一),你不必擔心內存管理。如果你創建你自己的類方法,你應該做同樣的事情:返回一個autorelease對象。

關於您的代碼,如果您只是將您的伊娃分配給NSString對象(從該方法返回),它將無法工作。事實上,在應用程序週期的某個時間點,對象將被釋放(它已被放入池中),您的ivar不會再引用任何對象。

訣竅:創建具有copy策略@property或發送copy消息如下所示:當一個類具有可變類型的子類

myVar = [[NSString stringWithFormat:@"%@",theValue] copy]; 

複製被正常使用。否則使用retain。完成後,您擁有該物品的所有權,您必須記得將其釋放。如果你不這樣做,會導致泄漏。

[myVar release]; 

P.S.由於Xcode 4.2有一個稱爲ARC的新編譯器功能。

希望它有幫助。

+2

或者更好,只要'myVar = [[NSString alloc] initWithFormat:「%@」,theValue];' – mipadi 2012-03-01 18:37:33

+0

是的,你是對的,但因爲我看過使用類方法,所以我保持原樣。 :) – 2012-03-01 18:51:05

+0

在我使用alloc的一句話是泄漏的女王... 100%。我正在發現問題來解除發佈/保留。看起來很簡單,我從蘋果,論壇和其他來源獲取大量文檔。當我應用這些規則時,程序會在我做的每件事情中找到EXEC_BAD_ACCESS :( – NemeSys 2012-03-01 18:52:51

5

你不需要release它,因爲這是一種方便的方法,它返回一個autoreleased對象。

的方式知道如果你正在爲1的保留計數的東西,你將需要使用Cocoa命名約定這不能不說什麼,用new方法名開始,alloc或含有copy將返回到釋放在這種情況下,其他人將返回autoreleased對象。