ios常見的錯誤與警告

來源:互聯網
上載者:User

一、常見的錯誤資訊

1. 
error: 'xxx' undeclared(first use in this function)

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

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

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

例: 

- (void)test
{
    int count = 0;
    return conut + 1;//出現變數count與conut不一致。 } 

正確的寫法:

- (void)test
{
    int count = 0;
    return count + 1;//將變數名count修改成一致。}

 

2. error: parse error before 'xxx' token

   在‘xxx’之前發生瞭解析錯誤。

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

 

例:

- (void)test

{
    NSString *str = @"This is test" //此處遺漏了分號
    NSLog(str);
}

3. error: invalid preprocessing directive #xxx 

    關鍵字#xxx不正確。

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

 

 例:

#improt <Cocoa/Cocoa.h>  //#import拼字錯誤

4. error: xxx.h: No Such file or directory 

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

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

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

 

例:

#import "AppContrller.h" //檔案AppContrller.h是不存在的。

正確的是:

#import AppContrller.h

 

 

5. error: Undefined symbols: 'xxx'

   符號‘xxx’沒有被定義。

 

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

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

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

 

 

 

 

二、常見的警告資訊 

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

 

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

    類‘xxx’中沒有方法‘yyy’的聲明。 

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

 

例:

NSString *str;
str = [NSString stringWithForatm:@"%d", 10];//方法名稱錯誤。

正確的是:

 NSString *str;

 str = [NSString stringWithFormat:@"%d", 10];

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

 

例:

有警告:

- (void)methodA
{
    [self methodB];//methodB的定義在後面
}

- (void)methodB
{

無警告: 

 

 - (void)methodB
{

- (void)methodA
{
    [self methodB];//methodB的定義在前時,不出現警告 
}
 

 

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

 

2. warning: unused variable 'xxx' 

   變數‘xxx’沒有被使用。

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

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

 

例:

- (void)test
{
    int a, b;//b沒有被使用
    a = 5;
    return a; 

 正確的是:

- (void)test
{
    int a;//將b的定義刪除
    a = 5;
    return a; 
}

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

    本地變數‘xxx’覆蓋了執行個體變數(即同名)。

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

 

例:

@interface MyObject:NSObject
{
    int count;
}
@end

@implementation MyObject

- (void)updateCount:(int)count
{
    //參數的名稱與執行個體變數名相同。
}

正確的是:

@interface MyObject:NSObject
{
    int count;
}
@end

@implementation MyObject

- (void)updateCount:(int)num
{
    //修改參數的名稱,使它與執行個體變數名不同。
}

4. warning: incomplete implementation of class 'xxx'

    warning: method definition for 'yyy' not found 

    類‘xxx’的代碼編寫沒有完成。

    方法‘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
{
    count++;//需要返回整型值而沒有返回任何值
}

正確的是:

- (int)test:(int)count
{
    return count++;
}

 

6. warning: passing argument n of 'xxx' assignment from distinct Objective-C type 

    方法‘xxx’的第n個參數與Objective-C的類型不一致。

註:向方法‘xxx’中傳遞參數時,傳遞過來的參數對象與方法中聲明的參數類型不一致時,會出現此警告。例如,聲明的是NSEnumerator類型,傳遞進來的為NSString類型,則顯示此警告。

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

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

 

例:

int value = 3;
NSString *str;
str = [NSString stringWithFormat:"%d", value];
//stringWithFormat:的參數不能是c語言的字串。

正確的是:

int value = 3;
NSString *str;
str = [NSString stringWithFormat:"@%d", value];
//在參數字串前追加@符號

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.