2010-12-19 69 views
1

我在自動釋放池中進行了大量的NSString操作。問題是我的程序有時會在游泳池流失之前崩潰。我想知道是否有辦法通過將nil分配給NSString來規避這個問題。對userLetters的分配發生了很多。見下面將自動釋放池中的NSString指定爲NSString

代碼之前

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    usersLetters = [usersLetters stringByReplacingCharactersInRange:NSMakeRange(indexUser, 1) withString:@"*"]; 
[pool drain]; 

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSString *temp = [usersLetters stringByReplacingCharactersInRange:NSMakeRange(indexUser, 1) withString:@"*"]; //remove that found character so it can't be reused again 
    usersLetters = nil; 
    usersLetters = temp; 
    temp = nil; 
[pool drain]; 

回答

1

我懷疑什麼分配到零將要達到什麼樣的幫助。 (我假設你的意思是你的程序因爲內存耗盡而崩潰,否則,它更可能是你經常在某處發佈的,你也應該在你的代碼上運行狀態分析器)。是發送一個保留消息給你仍然需要的所有對象(在你的情況下爲usersLetters),然後排出池。那麼你仍然需要的對象應該有一個保留計數1,所有其他自動釋放的對象應該已經被釋放。

在你的情況,這將是

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
usersLetters = [[usersLetters stringByReplacingCharactersInRange:NSMakeRange(indexUser, 1) withString:@"*"] retain]; //sending retain to an object increases its retain count by 1 and returns the object itself 
// some more stuff that needs memory 
[pool drain]; 
// ... 
[usersLetters release]; 
[pool release]; 
0

如果你的項目目標的iOS或Mac OS X你沒有提到如果是後者,解決這個問題最好的辦法可能是簡單地用垃圾採集。

如果GC不是一個選項(它不在iOS上),處理這個問題的慣用方法是在內部的快速分配操作周圍包裝一個嵌套的autorelease池。在這種情況下,您必須保留任何需要超過嵌套池的對象,正如mrueg所解釋的。