2010-07-28 154 views
0

我有下面的代碼來創建一個NSString來包含文本文件的主體,然後將其轉換爲NSData並將其輸出到文件。NSString和NSData內存管理

NSString *particleString = [[NSString alloc] initWithFormat:@"%@", @"This is the body of my file"];     
NSData *metaVals = [particleString dataUsingEncoding:NSISOLatin1StringEncoding]; 

既然我已經用ALLOC創建particleString,我想我需要釋放它。我已經完成其轉換爲NSData的後,因此我加

[particleString release]; 

但我的應用程序崩潰,當我加入這行。但是,當我刪除用於創建metaVals的行時,我可以放心地釋放它。

任何人都可以解釋爲什麼傳遞給NSData阻止我釋放它嗎?我相信我自己擁有了particleString,發生了什麼?

+0

你的應用程序崩潰的行是什麼? – Vladimir 2010-07-28 11:36:19

+0

它在達到發行版時崩潰。我忘記補充說,釋放particleString之前,我通過編寫修改它: particleString = [particleString stringByAppendingFormat:@「%@」,@「Some other string」]; 然後我釋放它。所以我的代碼是這樣的: NSString * particleString = [[NSString alloc] initWithFormat:@「%@」,@「這是我的文件的主體」]; particleString = [particleString stringByAppendingFormat:@「%@」,@「Some other string」]; NSData * metaVals = [particleString dataUsingEncoding:NSISOLatin1StringEncoding]; [particleString release]; – ar106 2010-07-28 12:02:05

+0

你可以編輯你的問題,並添加你的評論的內容,因爲你的評論是能夠回答這個問題的首要重要。注意已經給出的兩個答案都是正確的。 – JeremyP 2010-07-28 13:08:38

回答

3

根據你的評論,你做了particleString = [particleString stringByAppendingFormat:@"%@", @"Some other string"];,它丟失了對原始particleString的引用,並用自動發佈的版本替換它。然後,您繼續發佈自動發佈的版本,導致原始的particleString泄漏,並導致新版本的過度釋放。

試試這個

NSString *particleString = [NSString stringWithFormat:@"%@", @"This is the body of my file"]; 
particleString = [particleString stringByAppendingFormat:@"%@", @"Some other string"]; 
NSData *metaVals = [particleString dataUsingEncoding:NSISOLatin1StringEncoding]; 

它不再釋放,因爲這兩個字符串現在自動釋放。

我建議重讀memory management rules

+0

非常感謝。這真的很有幫助。 – ar106 2010-07-28 13:22:30

1
[particleString stringByAppendingFormat:@"%@", @"Some other string"]; 

這將返回一個新創建的對象。這意味着創建並分配給particleString的第一個對象正在泄漏,並且您試圖釋放通過使用-stringByAppendingFormat方法創建的新自動釋放對象:方法

您可以使用NSMutableString代替它,它具有方法名爲 appendFormat:(NSString *)...

+0

Joshua Weinberg的回答是一個同樣好的答案。我建議你使用你最喜歡的任何東西。 – 2010-07-28 12:47:17

+0

非常好。非常感謝你。 – ar106 2010-07-28 13:21:26