2010-12-11 73 views
1

我剛剛開始在Objective-C編程,我有經驗與C.我有一些代碼(約124行),我想移植到iOS(從OS X)。代碼的目的是生成一個URL,然後在Mobile Safari中打開它。鑑於該應用程序沒有用戶界面,並且它只是生成和打開URL的唯一目的,我希望在啓動應用程序時執行此代碼。執行C代碼在iPhone Objective-C項目啓動

我做了一些研究,發現如果我想要一些代碼在啓動執行我不得不把它放在「App_NameDelagate.m」文件,在

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ... } 

部分,捲曲之間brases。問題是,當我在我的代碼粘貼,並編譯它(在Xcode),我得到約7個左右的錯誤和警告,他說,在每一個函數聲明:

嵌套功能被禁用,則使用-fnested-功能重新啓用

在一個點(當我開始寫我的各種功能的代碼,和主「如果」函數結束)

控制到達非void函數的端

它自己的代碼由1個「if」函數和大約5個在「if」函數中調用的其他函數組成。

我知道自己的代碼很好,因爲我用它來構建具有相同目的的應用程序的Mac版本(以生成並打開URL)並且工作正常。

從OS X到iOS,我意識到一些Cocoa的變化,就像在OSX上使用[UIApplication sharedApplication]而不是[NSWorkspace sharedWorkspace]一樣在iOS上打開URL。所以我不認爲這是問題。我也在我的粘貼代碼的開始處刪除了「main」函數的標準聲明,因爲我知道它也在「main.m」文件中聲明。

在我的應用程序的Mac版本中,我能夠將代碼直接放入「main.m」文件中,代碼會編譯並且應用程序運行得很好。在iOS上我收集,情況並非如此。

任何與此有關的幫助將不勝感激,因爲它讓我瘋狂!

謝謝。

UPDATE:使問題 '嵌套函數' 行是:

INT generateCrosswordNumber(){

INT getDayNumber(){

布爾checkIfSunday(){

空隙handleSunday(){

void normalDay(){

以下每行代碼都是調用函數的代碼。對於每個功能,都有另一個花括號,用於關閉上面幾行打開的花括號。

return YES修復了function reaches end of non-void function錯誤,工作很好,謝謝!

+0

你能引用引起警告/錯誤的行嗎?對於「控制到達非空函數結束」,插入'return YES;'作爲方法實現的最後一行:「 - (BOOL)...」方法簽名期望方法返回一個BOOL值。 – Costique 2010-12-11 14:01:53

+0

感謝Costique,「返回YES」效果很好,已更新了帖子引起問題的線條。 – baxterma 2010-12-11 14:17:57

回答

5

所以首先,如果這個應用程序是爲App Store的,我認爲你必須有某種用戶界面。我不認爲你可以加載,然後立即保釋給Safari。但是你必須用Apple來檢查。

但是你遇到的問題是,你通常不能在Objective C方法中定義C函數。 [我想你可以在編譯器中啓用嵌套函數,但是我從來沒有嘗試過在客觀C方法中嵌套C函數。從理論上說應該工作,但它不是我們通常做的事情。]

,但你可以在你的方法調用 C函數。事實上,我們一直這樣做。這聽起來像你正在做這樣的事情:

- (int)someMethod:(int)x { 

    int someFunction(int x) { 

     return x + 2; 
    } 

    x = someFunction(x); 

    return x + 3; 
} 

注意你正在定義的方法定義一個C函數。而是你可以這樣做:

int someFunction(int x) { 

    return x + 2; 
} 

- (int)someMethod:(int)x { 

    x = someFunction(x); 

    return x + 3; 
} 

現在你定義一個C函數,然後定義也使用該功能的客觀C法。

編輯

出於好奇,我也試築巢ObjC方法定義中的C函數定義的一些簡單的情況下,這似乎與-fnested函數GCC很好地工作。也許對於一些簡單的情況,可能比在頂層定義函數更有表現力,但我認爲如果你在做一個方法中的多個或多個函數,那麼這可能不是一個好的設計。此外,Clang不支持這種做法,至少在這個平臺上編寫這樣的代碼可能不符合您的長期利益。

0

您的Objective-C代碼在結構上不正確。找到結構損壞的最佳方法可能是選擇全部然後編輯 - >格式 - >重新縮進

所有的函數定義應該從最左邊的列開始,並且破壞文件的解析應該是顯而易見的。它很可能是一個失蹤]或}。