2010-12-19 96 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所解释的。