iOS開發 常見的錯誤與警告

2021-07-03 06:27:33 字數 4179 閱讀 2743

1. error:

'***' undeclared(first use in this function)

還沒有定義(在此函式中第一次使用)。

注:使用某乙個變數時,如果使用前還沒有定義,會出現該錯誤。在oc以及c語言中,使用變數前必須先定義它。

這個錯誤經常出現在忘記進行變數定義的情況下。但是,慢慢拿習慣後,這種錯誤會出現得很少。反而經常出此種錯誤的原因是變數名拼寫錯誤,即出現使用的變數名與定義的變數名不一致的情況。

例: - (void)test 

正確的寫法:

- (void)test

2.error: parse error before '***' token

在『***』之前發生了解析錯誤。

注:這個是在發生低階失誤時才會出現的錯誤。解析錯誤的意思是程式語句以oc的語法不能解析。仔細看看發生錯誤的地方,一定會發現不符合語法的部分。

例: - (void

)test

3. error: invalid preprocessing directive #*** 

關鍵字#***不正確。

注:當#include,#import等以#開始的關鍵字出現拼寫錯誤時,會顯示這種錯誤資訊。在xcode中,緊隨#後輸入的字串都會變色,非常容易發生錯誤。

例: #improt //

#import拼寫錯誤

4. error: ***.h: no such file or directory 

名為***.h的檔案或目錄不存在。

注:在#include,#import中指定的檔案不存在時會顯示此種資訊。最可能的原因是,檔名輸入錯誤,好好檢查一下檔名。

如果發生這種錯誤,最好也確認一下實際檔案。因為還有可能是檔案的檢索路徑沒有指定正確。只要檔案是包含在工程的資料夾中都是沒有問題的。

例: #import""

//正確的是:

#import

5. error: undefined symbols: '***'

符號『***』沒有被定義。

注:此錯誤不僅在編譯時發生,在連線時也會發生。連線時使用了原本不存在的類或者函式時會出現此資訊。

最經常出現的是,函式名出現輸入錯誤。呼叫c語言函式的時候,就算名稱錯誤,編譯也會通過的。但是在連線的時候就會出現此錯誤的資訊。

其他可能的原因是,使用cocoa以外的框架或者庫時,這些框架或者庫沒有包含進工程中。需要的庫或者框架都必須包含到工程中。

二、常見的警告資訊

警告中有絕對需要修正的,也有完全不用理會的。但是,將所有的警告都消去還是讓人比較舒服的,所以還是要盡量修改。

1.  warning: '***' may not respond to 'yyy'

類『***』中沒有方法『yyy』的宣告。 

注:當呼叫某一類中的方法時,類宣告中並沒有包含此方法出現時此資訊。首先可能的原因是,方法名輸入錯誤,請仔細檢查一下方法名稱,確保正確。

例: nsstring *str;

str = [nsstring stringwithforatm:@"

%d", 10];//

方法名稱錯誤。

正確的是:

nsstring *str;

str = [nsstring stringwithformat:@"

%d", 10];

另外,在某一類呼叫自己定義的方法時,如果方法都追加在類宣告中的話,不會出現任何問題。如果實際呼叫的地方在方法定義的前方,也會出現這種警告資訊。這是因為編譯器對方法定義的檢查是從檔案的開始處順序經行的。利用這個特性,如果不想其他類呼叫方法,可以不用追加在類宣告中。

例: 有警告:

- (void)methoda

- (void)methodb

無警告: 

- (void)methodb

- (void)methoda

如果不理會這個警告會出現什麼情況?首先編譯與連線是能通過的,因此應用程式時能夠啟動的。但應用程式實際執行到此處時,才會檢查呼叫的方法到底是否真的在類中定義。如果沒有定義則丟擲異常,否則正常執行通過。因此,如果確實已經在類中定義了這個方法,可以故意忽略此警告。

2. warning: unused variable '***' 

變數『***』沒有被使用。

注:變數已經定義了,但是一次都沒有被使用時出現此資訊。經常出現的是,曾經使用的變數,經過修改後不再使用它了,但定義還儲存著。此時,只用刪除變數的定義即可。不刪也可以。

另外,定義的變數名與使用的變數名不一致時,也會出現這個警告資訊。

例: - (void)test 

正確的是:

- (void)test

3. warning: local declaration of '***' hides instance variable

本地變數『***』覆蓋了例項變數(即同名)。

注:當方法中定義的變數名與例項變數的某個變數同名,就會顯示這個警告資訊。因為同名,所有有一方將不能訪問。 這時外部的例項變數將不能被訪問,將一方變數名修改後即可。

例: @inte***ce

myobject:nsobject

@end

@implementation myobject

- (void)updatecount:(int)count

正確的是:

@inte***ce

myobject:nsobject

@end

@implementation myobject

- (void)updatecount:(int)num

4. warning: incomplete implementation of class '***'

warning: method definition for 'yyy' not found 

類『***』的**編寫沒有完成。

方法『yyy』的定義沒有找到。

注:沒有給類宣告中的某個方法編寫執行**時,會顯示此警告資訊。出現警告後,該完成的執行**應該完成,如果覺得這個方法不需要了,可以在類宣告檔案中刪除此方法的定義。另外,如果實際**處的方法名與定義的方法名出現不一致時,也會出現此警告資訊。

5.warning: control reaches end of non-void function 

非void型別的函式沒有設定返回值。

注:方法或函式需要返回值的情況下,沒有設定任何返回值時出現的警告資訊。 返回值型別為void以外的方法中,請務必返回乙個具體的值。如果不需要返回值,請將方法的返回值型別修改為void。

相反,如果返回值設定為void型別,而在函式或方法中返回了某個值的時候,會顯示 "'return' with a value, in function returning void(返回void的函式中,返回了值)"的警告。

例: - (int)test:(int)count

正確的是:

- (int)test:(

int)count

6. warning: passing argument n of '***' assignment from distinct objective-c type 

方法『***』的第n個引數與objective-c的型別不一致。

注:向方法『***』中傳遞引數時,傳遞過來的引數物件與方法中宣告的引數型別不一致時,會出現此警告。例如,宣告的是nsenumerator型別,傳遞進來的為nsstring型別,則顯示此警告。

最可能發生的原因是,方法的引數較多,設定時將順序弄錯了。在使用引數較多的方法時,出現這個警告資訊的情況下,請仔細檢查一下引數的順序。

另外,在定義方法時可以利用這個警告。如果想將傳遞過來的引數指定為特定的類時,給引數定義明確的型別。如果任何物件都可以的情況,則定義為id型別。引數的定義包含了類設計者給使用者的資訊。

例: intvalue = 3;

nsstring *str;

str = [nsstring stringwithformat:"

%d", value];

//stringwithformat:的引數不能是c語言的字串。

正確的是:

intvalue = 3;

nsstring *str;

str = [nsstring stringwithformat:"

@%d", value];

//在引數字串前追加@符號

iOS開發 常見錯誤和警告總結

nsstring是大家最常用的乙個類,幾乎人人都脫離不開,它的功能非常強大,但是它其中有點奧秘直到碰到了才發現。正文 nsstring的api中有乙個rangeofstring 這個也是大家常用的在字串中查詢的的api。我一般圖省事,都是用這個,很少用rangeofstring option 找到了...

IOS開發常見錯誤

1 問題表現 什麼情況?方法居然無法拉線?問題簡述 ios的空間拉線到乙個.h m檔案中 居然多次拖動無效.問題解決 ios的空間響應單單在 中建立乙個方法是沒用的,這個時候通常跟空間是沒有響應關係的 建立控制項的方式另外說 所以這個時候我們需要按住control鍵拖動一條線與對應的方法產生響應 在...

Keil常見錯誤警告

1 warning 767 d conversion from pointer to smaller integer 解釋 將指標轉換為較小的整數 影響 可能造成的影響 容易引起資料截斷,造成不必要的資料丟失。如果出現bug 很難除錯。改正 盡量避免這種轉換,避免不了要確定轉換的資料不會引起資料丟失...