Objective c 对象实例内存管理
这是另一个问题的后续问题,我的问题是关于main()中retain/release的使用。根据我在这个简单示例中的理解,不需要retain/release语句。但在更复杂的情况下,最好的做法是添加它们,因为这样可以确保planet实例不会意外释放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
+(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;
}
干杯garyMarkus 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:是的,因为你不必保留和释放对象。只要你不在其他自动存储池中做非常时髦的事情,直到你在
main
中创建的池。