我正在申報類型爲NSString
的伊娃。要初始化這個伊娃的價值,我使用下面的代碼:stringWithFormat創建保留+1實例嗎?
NSString *myVar;
-(void)inAnyMethod
{
myVar = [NSString stringWithFormat:@"%@",theValue];
}
我必須發佈此伊娃嗎?根據我的理解,這不是我的責任。但在大多數情況下,我以這種方式使用的字符串會導致泄漏。
我錯過了什麼?
我正在申報類型爲NSString
的伊娃。要初始化這個伊娃的價值,我使用下面的代碼:stringWithFormat創建保留+1實例嗎?
NSString *myVar;
-(void)inAnyMethod
{
myVar = [NSString stringWithFormat:@"%@",theValue];
}
我必須發佈此伊娃嗎?根據我的理解,這不是我的責任。但在大多數情況下,我以這種方式使用的字符串會導致泄漏。
我錯過了什麼?
除了奧斯卡戈麥斯回答,請注意,當你使用類方法(帶加號的方法,您可以在文檔中找到,並且不包括在奧斯卡戈麥斯列表,如stringWithFormat
就是其中之一),你不必擔心內存管理。如果你創建你自己的類方法,你應該做同樣的事情:返回一個autorelease對象。
關於您的代碼,如果您只是將您的伊娃分配給NSString
對象(從該方法返回),它將無法工作。事實上,在應用程序週期的某個時間點,對象將被釋放(它已被放入池中),您的ivar不會再引用任何對象。
訣竅:創建具有copy
策略@property
或發送copy
消息如下所示:當一個類具有可變類型的子類
myVar = [[NSString stringWithFormat:@"%@",theValue] copy];
複製被正常使用。否則使用retain
。完成後,您擁有該物品的所有權,您必須記得將其釋放。如果你不這樣做,會導致泄漏。
[myVar release];
P.S.由於Xcode 4.2有一個稱爲ARC的新編譯器功能。
希望它有幫助。
或者更好,只要'myVar = [[NSString alloc] initWithFormat:「%@」,theValue];' – mipadi 2012-03-01 18:37:33
是的,你是對的,但因爲我看過使用類方法,所以我保持原樣。 :) – 2012-03-01 18:51:05
在我使用alloc的一句話是泄漏的女王... 100%。我正在發現問題來解除發佈/保留。看起來很簡單,我從蘋果,論壇和其他來源獲取大量文檔。當我應用這些規則時,程序會在我做的每件事情中找到EXEC_BAD_ACCESS :( – NemeSys 2012-03-01 18:52:51
你不需要release
它,因爲這是一種方便的方法,它返回一個autoreleased
對象。
的方式知道如果你正在爲1的保留計數的東西,你將需要使用Cocoa
命名約定這不能不說什麼,用new
方法名開始,alloc
或含有copy
將返回到釋放在這種情況下,其他人將返回autoreleased
對象。
帶格式的字符串應該返回一個自動釋放的MSString對象。所以它應該稍後在自動發佈池中發佈。靜態分析儀是否說你正在泄漏? – 2012-03-01 18:13:02
是什麼讓你覺得有泄漏? – 2012-03-01 18:35:17
儀器。在我使用的每4個NSString對象的每3箇中,標記了泄漏的百分比。 – NemeSys 2012-03-01 18:49:19