Objective c 自动释放溺水

Objective c 自动释放溺水,objective-c,cocoa,cocoa-touch,memory-management,memory-leaks,Objective C,Cocoa,Cocoa Touch,Memory Management,Memory Leaks,我在自动释放池中遇到了一个似乎被称为“溺水”的问题 我的代码正确地创建和销毁对象。然而,我使用了一些类方法,在我不知道的情况下自动释放几个变量。考虑到他们每分钟都循环上千次。。。我发现自己淹没在程序中丢失的数千个未发布的对象中 2个问题: 所以要么我根本不使用类方法——这是一个永久性的解决方案,要么,即使如此,一些实例方法(Foundation,UIKit)仍然会在我不知道的情况下自动释放对象吗 或者我可以在调用类方法之前分配一个自动释放池,并在调用类方法之后将其释放-这是一个永久性的解决方案吗

我在自动释放池中遇到了一个似乎被称为“溺水”的问题

我的代码正确地创建和销毁对象。然而,我使用了一些类方法,在我不知道的情况下自动释放几个变量。考虑到他们每分钟都循环上千次。。。我发现自己淹没在程序中丢失的数千个未发布的对象中

2个问题:

  • 所以要么我根本不使用类方法——这是一个永久性的解决方案,要么,即使如此,一些实例方法(Foundation,UIKit)仍然会在我不知道的情况下自动释放对象吗

  • 或者我可以在调用类方法之前分配一个自动释放池,并在调用类方法之后将其释放-这是一个永久性的解决方案吗

  • 不使用类方法并不意味着要避免自动删除对象。例如:
    NSString*path=[anotherString stringByAppendingPathComponent:@“foo”]
    返回一个自动删除的对象,但不涉及任何类方法。据我所知,避免自动释放对象的唯一方法是不使用对象。如果你真的想走这条路,去看看CoreFoundation。(我不建议走那条路线。)

  • 如果你有一些疯狂的工厂方法,可以创建成吨的自动释放池,那么我可能会这样做:

    + (id) crazyFactoryMethodWithFoo:(id)foo { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; id returnValue = nil; //generate gobs of autoreleased objects returnValue = [something retain]; [pool release]; return [returnValue autorelease]; } +(id)crazyFactoryMethodWithFoo:(id)foo{ NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init]; id返回值=零; //生成自动释放对象的gob returnValue=[something retain]; [池释放]; 返回[返回值自动释放]; } 通过在清空池之前显式保留返回值,可以确保返回值在自动释放池销毁之后仍然有效。然后,通过自动恢复返回值并返回它来平衡
    保留的


  • 戴夫·德隆已经回答了你的问题,但通常情况下,当你把游泳池填得太高的时候,你会处于一个非常紧张的循环中。在这种情况下,只需为循环的每次迭代创建另一个自动释放池

    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。