如何在NSOperation中处理exit()

时间:2011-04-06 06:56:43

标签: iphone objective-c c nsoperation

我有一个C源代码作为我想在我的iPhone应用程序中使用的应用程序。我认为最好的方法是在NSOperation子类中调用该C Application的main方法。

这样可以正常工作,除非C应用程序中的某些内容出错且调用了exit() / abort(),这会使我的整个iPHone应用程序失效。

C代码非常冗长,我不想通过它或以任何方式打扰它。我想知道我是否可以绕过exit()中的abort() / NSOperation次调用,以便它只退出线程,而不是整个应用程序。

3 个答案:

答案 0 :(得分:0)

如何使用-Dexit = my_exit -Dabort = my_abort选项进行编译,并按以下方式实现my_exit和my_abort?

void my_exit(int status)
{
    if (!/* check thread ID or so forth, and check during calling the NSOperation */) {
        exit(status);
    }
}

答案 1 :(得分:0)

当您自己编译C代码时,您可以添加自己的exit()abort()函数,然后C代码将调用那些而不是库中的代码。定义它们以将适当的状态传递给Obj-C代码并关闭线程。

对于真正的隔离,当然要使用NSTask ...

答案 2 :(得分:0)

我认为在abort()之后没有任何实际的方法可以继续,exit()可能相同。这两个调用实际上都终止了进程,这意味着原始程序员可能没有费心去清理已分配的资源和文件描述符等。所以即使你终止线程而不是进程,你的应用程序几乎肯定会像筛子那样泄漏无论何时调用重写的exit()/ abort()。

更严重的是,如果程序调用了abort(),它可能会检测到运行时或程序员错误导致的一些不可恢复的问题。例如,缓冲区溢出可能已损坏堆。因此可能无法从这种情况中恢复过来。

我担心你必须审核exit()abort()的每一次出现,看看是否可以安全地终止该线程。