如果我有一个具有自身的sharedInstance(单例模式)的类或另一个类的共享实例,那么当我的程序退出时,如何确保正确释放共享实例?更好的是,你能指点我一些关于这方面的文件吗?
示例类(为清晰起见,删除了所有其他方法):
@interface Foo : NSObject { } + (Foo*)sharedInstance; @end
.m文件:
static Foo* SharedInstance; @implementation Foo + (Foo*)sharedInstance { if (!SharedInstance) SharedInstance = [[Foo alloc] init]; // possible memory leak? return SharedInstance; } @end
在上面的代码中,什么时候可以释放SharedInstance?
除非需要释放共享实例之外的资源(例如文件,清理时的通知等),否则可以在应用程序出口处清除sharedInstance的内存.操作系统会在应用程序出口处清除文件和网络套接字等,这样您就可以避免清理它们.
如果您确实需要在应用程序退出之前执行清理操作,则必须向cleanup
共享实例添加一个或类似的方法,并使用静态方法来释放共享实例.
Barry指出,通常没有必要在退出时清理任何东西,但你可以做的是设置一个实现的NSApplication委托
- (void)applicationWillTerminate:(NSNotification *)aNotification
然后在您的应用程序退出之前调用此方法.在此方法中,您可以调用共享实例类的一些静态方法来清理内部缓存的共享实例.
但是,不存在应用程序退出之外的内存泄漏等问题.如果您的应用程序终止,它所拥有的所有内存都将返回给系统,无论它是如何分配的.如果情况并非如此,并且您的应用程序将崩溃,那么它在崩溃之前使用的内存最终会丢失到系统中,这是不可接受的.在多任务操作系统上,崩溃的应用程序不得对系统的其余部分产生任何负面影响!