2011-10-31 53 views
-1
[row setObject:[NSString stringWithCString:value encoding:NSUTF8StringEncoding] forKey:columnName]; 

其中row是一個NSMutableDictionary ..有沒有不同的方式將此字符串注入我的字典?這條線爲什麼會泄漏內存?

+2

誰告訴你泄漏內存? – chown

+0

我正在使用我的分析工具,它顯示那裏有泄漏。 – box86rowh

回答

0

我以前曾經有過這個問題,因爲NSMutableDictionary擁有它不會被釋放,直到字典被釋放的對象。

我會建議你的代碼中的某個對象正在釋放它沒有正確釋放它擁有的變量,可能是NSMutableDictionary *row dealloc'd。

+0

所以如果我有一個包含多個對象的自定義類,是釋放該自定義類中的每個活動對象的更好形式,然後釋放父對象? – box86rowh

+0

在你分配/ init/copy一個對象的每個類中,該類應該負責在dealloc期間釋放這些對象。我有和你一樣的事情,Profiler告訴我這個代碼泄露了。我的問題是我沒有正確地釋放一個父對象,所以它下面的所有東西都不會被釋放。 – Littlejon

+0

除非你使用SDK5.0的ARC(自動引用計數),否則你應該沒有問題。 – Littlejon

1

,分析工具的說,因爲字符串爲「自動釋放」,所以你可以通過

  • 把一個NSAutoreleasePool圍繞它進行優化
  • 分配/初始化那麼STR釋放
  • 或只是忽略優化消息。

這是一種方式:

NSString *str = [[NSString alloc] initWithCString:value encoding:NSUTF8StringEncoding]; 
[row setObject:str forKey:columnName]; 
[str release]; 
+0

你提供的代碼是不是最終與NSString對象具有完全相同的保留計數? – Littlejon

+0

這取決於您的代碼中的自動發佈的字符串將不會獲得free'd,直到它遇到autorelease pool drain/release,並且符合警告標準的分析工具。當你手動發佈它時,它在發佈時是免費的,這些工具認爲它是標準的編碼方式,但差異是微不足道的,以至於它最終確實無關緊要。你的代碼寫得更快,閱讀和看起來更乾淨,所以我會保持它的個人風格。 – chown