ios學習——nil、NULL和NSNull
阿新 • • 發佈:2019-02-04
nil用來給物件賦值(oc的任何物件都屬於id型別),NULL則給任何指正賦值,NULL和nil不能互換,nil用於類指標賦值(在oc中類是一個物件,是類的meta-class的例項),而NSNull則用於集合操作,雖然它們表示的都是空值,但使用場合完全不同,所以在編碼時要嚴格按照變數型別來賦值,將正確的空值賦給正確的型別,使程式碼抑鬱閱讀和維護,也不易引起錯誤。
//判斷物件不為空
OC程式碼
//判斷物件為空
OC程式碼
//陣列初始化,空值結束
OC程式碼
//判斷陣列元素是否為空
OC程式碼
//判斷字典物件的元素是否為空
OC程式碼
Oc有個特性,就是當傳送訊息給nil物件時,系統返回0值而不是引起異常,這和java煩人的NullPointerException以及C/C++的程式直接崩潰的處理完全不同,明白Oc的這個特性對於開發正確的ios程式非常重要,因為nil是物件的合法值,nil物件同樣可以接受訊息。eg:
OC程式碼
將物件置空,然後傳送訊息,程式同樣接著往下執行而不會崩潰。
OC程式碼
物件以為空,獲取的資料可能已經不正確,這段程式碼將列印如下。
number = 0.00
空值處理不當是引起程式錯誤乃至崩潰的重要原因之一。
因為oc的集合物件,如NSArray,NSDictionary,NSSet等,都有可能包含NSNull物件,所以,如果以下程式碼中的item為NSNull,則會引起程式崩潰。
OC程式碼
以下程式碼時常見的錯誤,release物件沒有設定為nil,從而引起程式崩潰。
OC程式碼
//判斷物件不為空
OC程式碼
- if (object) {}
//判斷物件為空
OC程式碼
- if (object == nil) {}
//陣列初始化,空值結束
OC程式碼
- NSArray *pageNames = [[NSArrayalloc] initWithObjects:@"Document", @"Advanced", @"Statistics", nil ];
//判斷陣列元素是否為空
OC程式碼
- UIViewController *controller = [NSArray objectAtIndex:i];
- if ((NsNull *)controller == [NSNull null]) {}
//判斷字典物件的元素是否為空
OC程式碼
-
NSString *userId = [NSDictionaryobjectForKey:@"key"
- if (userId == [NSNullnull]) {}
Oc有個特性,就是當傳送訊息給nil物件時,系統返回0值而不是引起異常,這和java煩人的NullPointerException以及C/C++的程式直接崩潰的處理完全不同,明白Oc的這個特性對於開發正確的ios程式非常重要,因為nil是物件的合法值,nil物件同樣可以接受訊息。eg:
OC程式碼
- person = nil;
- [person castBallot];
- NSLog(@"person = %@", person);
將物件置空,然後傳送訊息,程式同樣接著往下執行而不會崩潰。
OC程式碼
- NSDecimalNumber *number = nil;
- NSLog(@"number = %.2f", [number doubleValue]);
物件以為空,獲取的資料可能已經不正確,這段程式碼將列印如下。
number = 0.00
空值處理不當是引起程式錯誤乃至崩潰的重要原因之一。
因為oc的集合物件,如NSArray,NSDictionary,NSSet等,都有可能包含NSNull物件,所以,如果以下程式碼中的item為NSNull,則會引起程式崩潰。
OC程式碼
- NSString *item = [NSArray objectAtIndex:i];
- if ([item isEqualToString:@"test"]) {
- }
以下程式碼時常見的錯誤,release物件沒有設定為nil,從而引起程式崩潰。
OC程式碼
- id someObj = [[Objectalloc] init];
- ...
- [someObj release];
- ...
- if (someObj) {
- }