2011-11-11 82 views
0
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
NSData *data = nil; 
data = [prefs dataForKey:[NSString stringWithFormat:KEY_STR, index]]; 

NSData實際上有1.5M大小,我可以在數據完成後立即釋放內存嗎?如何手動釋放由自動釋放池分配的內存

+3

你確定你真的想要在NSUserDefaults中存儲1.5mb的數據嗎?這似乎不符合NSUserDefaults設計的精神,文檔建議不要這樣做。您可以將數據存儲在外部文件中,並在首選項設置中引用它。 – stevex

回答

1

你需要創建自己的NSAutoreleasePool此操作:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
// Your code here 
[pool drain]; 

但除非你只要有一個很好的理由,你應該知道,你就大功告成了處理你的事件處理和應用程序返回到主運行循環,默認的自動釋放池將耗盡,你的內存將被釋放。所以我不會擔心它,除非你認爲有充分的理由。

+0

我非常同意這一點(儘管你可能更喜歡'[pool drain]'出於風格的原因);我唯一需要手動管理自動釋放池的方法是在循環的每次迭代過程中在池中留下大量數據,否則會造成巨大的內存高峯瓶頸。 – Tommy

+0

對於ARC(自動引用計數),使用@autorelease編譯器指令。 –

+0

@stevex,謝謝你的回覆,這對我很有幫助 –

0

沒有什麼可以阻止你創建一個對象並自動釋放池內釋放它(自動釋放池只釋放負責自動釋放這些都在其中創建對象)

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

NSArray *array = [[NSArray alloc] init] 
[array release] 

[pool release]; 

是完全沒有問題。事實上,由於主運行循環有自己的自動釋放池,並定期將其耗盡,所以在這種情況下不可避免地會出現這種情況。這不適用於使用ARC的情況。

我也想同意stevex將兆字節存入NSUserDefaults是錯誤的,並且會讓你陷入與iCloud相悖的困境。將數據寫入文件。