2009-11-16 90 views
0

这是另外一个问题一个遵循,我的问题是关于主要使用保留/释放的()。根据我对这个简单例子的理解,不需要保留/发布声明。但在更复杂的情况下,添加它们的最佳做法是确保星球实例不会意外释放。对象实例内存管理

+(Planet *) planet { 
    gPlanetCount++; 
    //return [[[Planet alloc] init] autorelease]; 
    return [[[self alloc] init] autorelease];  // Better 
} 

int main(int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    Planet *outerMost; 

    outerMost = [[Planet planet] retain]; 
    ... 
    ... some code 
    ... 
    [outerMost release]; 
    [pool drain]; 
    return 0; 
} 

EDIT_001

所以,我可以更好地写出上面。

int main(int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    Planet *outerMost; 

    outerMost = [Planet planet]; 
    ... 
    ... some code 
    ... 
    [pool drain]; 
    return 0; 
} 

欢呼加里

+1

的内存管理代码似乎是正确的,但你可能要添加 NSAutoreleasePool *池= [[NSAutoreleasePool的alloc]初始化]作为主要功能的第一行。你可能只会忘记把它留在你的片段中,因为你最后会把水池排空。 – 2009-11-16 09:00:53

+0

马库斯,我会补充说,现在的正确性,我有它在我的代码,我只是忘了添加在这里,感谢您指出了这一点。 – fuzzygoat 2009-11-16 10:28:42

+0

我从来没有见过在类级方法中使用[self alloc]。这是否工作?我认为“自我”是为类的实例保留的。 – rein 2009-11-16 10:39:52

回答

3

马库斯·缪勒的评论是正确的,那就是,你的代码是正确的,除了缺少的池分配和初始化。然而,如果你在一个例程/方法中创建了一个自动释放对象,并且你在那个例程/方法中使用了该对象,并且你已经完成了它,那么在你退出该例程/方法之前,没有理由保留它然后释放它。该目的是保证被保留,该例程/方法的寿命的持续时间,并且,在这种情况下,将最有可能由[池漏极]方法释放。

你不会有哪里最意外释放的情况。预期版本在[pool drain]中。不要紧,有多少其他的方法是从内main()中,只要你是恶心的保留/释放准则,最不需要保留调用。

+0

啊我明白了,那么你会认为EDIT_001是写这个的更好方法吗? – fuzzygoat 2009-11-16 10:37:40

+0

模糊:是的,因为你没有不必要的保留和释放物体。只要你不用其他autorelease池做非常时髦的事情,自动释放将不会到期,直到你在'main'中创建的池失效。 – 2009-11-16 15:30:43

+0

谢谢彼得。 – fuzzygoat 2009-11-16 16:58:03