Objective c 自动释放溺水
我在自动释放池中遇到了一个似乎被称为“溺水”的问题 我的代码正确地创建和销毁对象。然而,我使用了一些类方法,在我不知道的情况下自动释放几个变量。考虑到他们每分钟都循环上千次。。。我发现自己淹没在程序中丢失的数千个未发布的对象中 2个问题:Objective c 自动释放溺水,objective-c,cocoa,cocoa-touch,memory-management,memory-leaks,Objective C,Cocoa,Cocoa Touch,Memory Management,Memory Leaks,我在自动释放池中遇到了一个似乎被称为“溺水”的问题 我的代码正确地创建和销毁对象。然而,我使用了一些类方法,在我不知道的情况下自动释放几个变量。考虑到他们每分钟都循环上千次。。。我发现自己淹没在程序中丢失的数千个未发布的对象中 2个问题: 所以要么我根本不使用类方法——这是一个永久性的解决方案,要么,即使如此,一些实例方法(Foundation,UIKit)仍然会在我不知道的情况下自动释放对象吗 或者我可以在调用类方法之前分配一个自动释放池,并在调用类方法之后将其释放-这是一个永久性的解决方案吗
NSString*path=[anotherString stringByAppendingPathComponent:@“foo”]
返回一个自动删除的对象,但不涉及任何类方法。据我所知,避免自动释放对象的唯一方法是不使用对象。如果你真的想走这条路,去看看CoreFoundation。(我不建议走那条路线。)保留的
戴夫·德隆已经回答了你的问题,但通常情况下,当你把游泳池填得太高的时候,你会处于一个非常紧张的循环中。在这种情况下,只需为循环的每次迭代创建另一个自动释放池
for (NSUInteger i = 0; i < 1000000000; i++)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// do the work
[pool release];
}
for(整数i=0;i<100000000;i++)
{
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
//做这项工作
[池释放];
}
对象将自动添加到当前线程最近创建的自动释放池中。通过为循环的每一次迭代创建一个对象,您可以快速摆脱不需要的对象,而不是让它们堆积在运行循环的池中。@Dave DeLong这很好。问题是我一直在使用默认值。。。这个类的方法创建自动释放的对象。现在我明白苹果为什么不推荐它了。我也一直在使用NSString方法,就像你提到的那样。在循环时,我遇到了这些奇怪的问题。您有什么建议可以轻松替换NSUserDefaults?谢谢。@GSchv为什么您认为需要替换
NSUserDefaults
?如果它返回给您一个自动释放的对象,并且您希望在当前自动释放池的生存期之后保留该对象,那么只需保留该对象(然后使用完后释放它)。[pool drain]
是首选方法@Dave DeLong实际上我需要的恰恰相反:我想要摆脱自动释放的对象。你看,我一直在疯狂地使用NSUserDefaults,所以有很多自动释放的对象没有被释放。你明白我的问题吗?见下面的答案,dreamlax明白我的意思了。尝试循环NSUserDefaults standardUserDefaults 10000次,它将崩溃,因为它返回一堆未发布的对象。@GSchv如果您在NSUserDefaults
中存储了那么多对象,您可能不应该使用它。它的目的是存储您的“默认值”(即您的首选项),并且可能只用于少量实际应用程序数据。考虑数据库或CordaDATA。