Objective c 对象实例内存管理

Objective c 对象实例内存管理,objective-c,cocoa,Objective C,Cocoa,这是另一个问题的后续问题,我的问题是关于main()中retain/release的使用。根据我在这个简单示例中的理解,不需要retain/release语句。但在更复杂的情况下,最好的做法是添加它们,因为这样可以确保planet实例不会意外释放 +(Planet *) planet { gPlanetCount++; //return [[[Planet alloc] init] autorelease]; return [[[self alloc] init] aut

这是另一个问题的后续问题,我的问题是关于main()中retain/release的使用。根据我在这个简单示例中的理解,不需要retain/release语句。但在更复杂的情况下,最好的做法是添加它们,因为这样可以确保planet实例不会意外释放

+(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;
}
编辑001 所以我最好把上面的内容写成

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

    Planet *outerMost;

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

干杯gary

Markus Müller的评论是正确的,也就是说,除了缺少池分配和初始化之外,您的代码是正确的

但是,如果您在例程/方法中创建了自动释放的对象,并且在该例程/方法中使用了该对象,并且在退出该例程/方法之前已完成该操作,则没有理由保留该对象,然后再将其释放。该对象保证在例程/方法的生命周期内保持不变,在这种情况下,它很可能通过[池排水]方法释放


您不会遇到最外层意外释放的情况。预期版本位于[池排水]中。无论从main()中调用了多少其他方法,只要您对保留/释放准则感到厌烦,最外层的方法就不需要保留。

Markus Müller的评论是正确的,也就是说,除了缺少池分配和初始化之外,您的代码是正确的

但是,如果您在例程/方法中创建了自动释放的对象,并且在该例程/方法中使用了该对象,并且在退出该例程/方法之前已完成该操作,则没有理由保留该对象,然后再将其释放。该对象保证在例程/方法的生命周期内保持不变,在这种情况下,它很可能通过[池排水]方法释放


您不会遇到最外层意外释放的情况。预期版本位于[池排水]中。无论从main()中调用了多少其他方法,只要您对保留/释放准则感到厌烦,最外层的方法就不需要保留。

内存管理代码似乎是正确的,但您可能需要添加NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init];作为主要功能的第一行。您可能只是在最后耗尽池时忘记将其保留在代码段中。Markus,为了正确起见,我现在将添加它,我的代码中有它,我只是忘记在这里添加它,感谢您指出这一点。我从未见过在类级方法中使用[self-alloc]。这行吗?我认为“self”是为类的实例保留的。是的,您的编辑更好。@Rein,显然苹果公司在类方法中进行alloc的首选方法是使用“id newInstance=[[self alloc]init];//极好”,其中的“id newInstance=[[Rectangle alloc]init];//GOOD”表示类是子类。我将更新我的问题以供将来参考…内存管理代码似乎是正确的,但您可能希望添加NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init];作为主要功能的第一行。您可能只是在最后耗尽池时忘记将其保留在代码段中。Markus,为了正确起见,我现在将添加它,我的代码中有它,我只是忘记在这里添加它,感谢您指出这一点。我从未见过在类级方法中使用[self-alloc]。这行吗?我认为“self”是为类的实例保留的。是的,您的编辑更好。@Rein,显然苹果公司在类方法中进行alloc的首选方法是使用“id newInstance=[[self alloc]init];//极好”,其中的“id newInstance=[[Rectangle alloc]init];//GOOD”表示类是子类。我将更新我的问题以供将来参考……我明白了,所以你会认为EdgEyt1是一个更好的方式来写这个吗?FuffyHave:是的,因为你不必保留和释放对象。只要你不在其他自动存储池中做非常时髦的事情,直到你在主< <代码>中创建的池耗尽为止,自动保存才会到期。我明白了,所以你会认为EdgEyt1是一个更好的方式来写这个吗?FuffyHave:是的,因为你不需要不必要地保留和释放对象。只要您不使用其他自动释放池执行非常奇怪的操作,自动释放将不会到期,直到您耗尽在
main
中创建的池。