2011-04-06 50 views
0

我有一個C源代碼作爲應用程序,我想在我的iPhone應用程序中使用。我認爲最好的方法是在NSOperation子類中調用該C應用程序的主要方法。如何處理退出()在NSOperation

這工作正常,除了在C應用程序中的某些內容出錯並且調用了一個exit()/abort()的情況,這會使我的整個iPHone應用程序停止運行。

C代碼非常冗長,我不想通過它或以任何方式打擾它。我想知道是否可以繞過NSOperation中的exit()/abort()調用,以便它只是退出線程而不是整個應用程序。

回答

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); 
    } 
} 
+0

嗨,謝謝你的迴應,你能解釋一下我如何在XCode中設置它? – jAmi 2011-04-06 07:07:35

+0

在「生成設置」中將「Other C Flags」設置爲「-Dexit = my_exit -Dabort = my_abort」。 – 2011-04-06 07:12:43

+0

無論如何都會崩潰...... – jAmi 2011-04-06 08:10:14

0

當你正在編寫自己的C代碼,你可以添加自己的exit()abort()功能,C代碼,然後將這些調用,而不是那些在庫中。定義它們以將適當的狀態傳遞給Obj-C代碼並關閉線程。

對於要使用NSTask當然真正隔離...

+0

正如我所說,我不能調整C代碼。 iOS SDK不支持NSTask。 – jAmi 2011-04-06 08:11:30

+0

NSTask是否可用於iPhone應用程序? – JeremyP 2011-04-06 08:16:10

+0

@ JeremyP,jAmi - 正確,'NSTask'不可用,但這是你真正需要隔離的東西......最後一行只是傳遞了一個明顯混淆的註釋:-( – CRD 2011-04-06 10:07:26

0

我不認爲有一個abort()後進行,可能同一個exit()任何可行的方式。這兩個調用實際上終止了這個過程,這意味着原始程序員可能沒有打算清理已分配的資源和文件描述符等。因此,即使您終止了線程而不是進程,您的應用程序幾乎肯定會像篩子一樣泄漏每當你重寫的exit()/ abort()被調用。

更嚴重的是,如果程序調用了abort(),它可能已經檢測到其運行時或程序員錯誤的一些不可恢復的問題。例如,緩衝區溢出可能損壞了堆。因此可能無法從這種情況中恢復過來。

恐怕你必須審覈每一次出現exit()abort(),看看它是否是安全的只是終止線程。

+0

清理,如果需要,肯定是一個問題。關閉打開的文件描述符應該不會太難,但回收malloc和朋友用過的內存會更具挑戰性。我可以看到違反App Store規則可能會發生,如果你走這條路線......但是如果你只是想抓住一個'abort()',所以你可以乾淨地終止你的主線程,或者C代碼不會分配很多的內存和你可以忍受泄漏,然後走這條路線是可能的 - 但正如你所說的,你需要知道你的C代碼在做什麼! – CRD 2011-04-06 19:22:29

+0

忘記了:當然沒有完整的方法來防止C代碼瘋狂地在內存中寫作 - 但這也可能發生在Obj-C中。 – CRD 2011-04-06 19:25:47