2013-04-04 82 views
0

我试图释放在守护进程结束时分配的资源,或者如果有人退出进程。在NSRunLoop结束时释放资源

比方说,

int main(int argc, const char * argv[]) 
{ 
    Controller *controller = [[Controller alloc] init]; 
    [controller allocateresources]; 

    [[NSRunLoop currentRunLoop] run]; 

    [controller release]; 

    return 0; 
} 

这里控制器版本将不会被调用。退出[SIGTERM信号]只是终止runloop。如何在应用程序结束时释放在类Controller中分配的资源?

编辑:我知道系统会声称资源回来。事情,我试图解决的是像跨进程合作锁。

+0

如果应用程序正在结束,您确实不需要担心发布任何内容,因为系统将从应用程序中收回所有内容。但通常你会创建并调用一个dealloc方法。 (使用MRC而不是ARC)和runloop一样,你也可以使用autorelease。 – uchuugaka 2013-04-04 12:00:57

+0

你不需要。 – 2013-04-04 12:01:30

+0

@uchuugaka我试图使用autorelease池。它不调用dealloc方法。 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; Controller * controller = [[[Controller [alloc] init] autorelease]; [[NSRunLoop currentRunLoop] run]; [pool drain]; – MacGeek 2013-04-04 12:17:53

回答

2

我不认为真的有保证你会从-run方法返回。所以你不应该依靠这个来释放资源。还有其他方法可以做到这一点。例如,一个非常低级别的解决方案是实现一个atexit对处理器

https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/atexit.3.html

,做锁的必要释放在那里。

+0

在看这个方法之前(通过引用您的答案),我实现了Unix信号处理程序来清理。你认为哪种方法更清洁? – MacGeek 2013-04-04 15:16:03

+0

信号处理程序仅适用于某些信号。我认为atexit处理器几乎适用于所有应用程序退出的方式。唯一的例外情况是atexit处理程序没有被调用,如果程序用_exit()退出。 – ashcatch 2013-04-04 15:20:37

+0

谢谢。这种方法对我来说非常完美,而且更干净。 – MacGeek 2013-04-04 15:31:00