你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS 初級錯誤和警告匯總

iOS 初級錯誤和警告匯總

編輯:IOS開發綜合

這是一篇適合初級開發者學習的文章, 總結了一些很初級的錯誤和警告.

錯誤信息

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   //#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以外的框架或者庫時,這些框架或者庫沒有包含進工程中。需要的庫或者框架都必須包含到工程中。

6.Expression is not assignable

這裡寫圖片描述

報錯原因:OC不允許直接修改某個對象的結構體屬性的成員
_btn 是個對象, frame是個結構體。
對象和結構體是不一樣的,結構體是C語言中的,裡面可以定義許多屬性,但是不能定義方法,而對象是即可以定義屬性又可以定義方法的,是典型的面向對象語法。
如何改變對象中結構體屬性的成員:
解決方法一:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;"> // 既然不能直接修改對象中的結構體屬性成員 // 先取出結構體 CGRect frame = _btn.frame; // 修改結構體 frame.origin.y -= 10; // 將修改後的結構體重新賦值回去 _btn.frame = frame;

解決方法二:

    // 先取出y值
    CGFloat y = _btn.frame.origin.y;
    // 修改y值
    y -= 10;
    // 重新設置_btn的y值,其他屬性和_btn保持不變
_btn.frame = CGRectMake(_btn.frame.origin.x, y, _btn.frame.size.width,_btn.frame.size.height);

7.Property ‘tag’ not found on object of type ‘_strong id’

這裡寫圖片描述

報錯原因:id類型不能使用點語法
解決方式一:

    // 利用get方法獲取tag值
    NSInteger i = [sender tag];

解決方式二:

// 將id強轉為UIButton
    UIButton *button = (UIButton *)sender;
    // 就能使用點語法獲取tag,編譯器很笨的,他只會根據當前類型,去判斷是否能使用這個語法。一般強轉為對應類型,就能使用對應類型的方法了。
NSInteger i = button.tag;

8.linker command failed with exit code 1 (use –v to see invocation)

這裡寫圖片描述

報錯原因,利用下劃線訪問了@package這個權限裡的東西。
這裡寫圖片描述

被@package 修飾的成員屬性只能在同一個框架內部才允許訪問。否則會引發link erro。
@private 實例變量只能被聲明它的類訪問
@protected 實例變量能被聲明它的類和子類訪問。
@public 實例變量可以被任何類訪問。

9.-[UITableViewController loadView] loaded the “2-view-3” nib but didn’t get a UITableView

這裡寫圖片描述

原因是:UITableViewController控制器不能加載UITableView,因為它會去加載stroyboard中的UIView。
解決方案:將stroyboard中的UIView改成UITableView

10.Cannot assign to ‘self’ outside of method in the init family

這裡寫圖片描述

原因:只能在init方法中給self賦值,Xcode判斷是否為init方法規則:方法返回id,並且名字以init+大寫字母開頭+其他 為准則。例如:- (id) initWithXXX;

警告

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

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];
//在參數字符串前追加@符號
   
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved