1. 程式人生 > >ios學習——nil、NULL和NSNull

ios學習——nil、NULL和NSNull

  nil用來給物件賦值(oc的任何物件都屬於id型別),NULL則給任何指正賦值,NULL和nil不能互換,nil用於類指標賦值(在oc中類是一個物件,是類的meta-class的例項),而NSNull則用於集合操作,雖然它們表示的都是空值,但使用場合完全不同,所以在編碼時要嚴格按照變數型別來賦值,將正確的空值賦給正確的型別,使程式碼抑鬱閱讀和維護,也不易引起錯誤。 
     //判斷物件不為空 
OC程式碼  收藏程式碼
  1. if (object) {}  

    //判斷物件為空 
OC程式碼  收藏程式碼
  1. if (object == nil) {}  

    //陣列初始化,空值結束 
OC程式碼  收藏程式碼
  1. NSArray *pageNames = [[NSArrayalloc] initWithObjects:@"Document", @"Advanced", @"Statistics", nil ];  

    //判斷陣列元素是否為空 
OC程式碼  收藏程式碼
  1. UIViewController *controller = [NSArray objectAtIndex:i];  
  2.     if ((NsNull *)controller == [NSNull null]) {}  

    //判斷字典物件的元素是否為空 
OC程式碼  收藏程式碼
  1. NSString *userId = [NSDictionaryobjectForKey:@"key"
    ];  
  2.     if (userId == [NSNullnull]) {}  


     Oc有個特性,就是當傳送訊息給nil物件時,系統返回0值而不是引起異常,這和java煩人的NullPointerException以及C/C++的程式直接崩潰的處理完全不同,明白Oc的這個特性對於開發正確的ios程式非常重要,因為nil是物件的合法值,nil物件同樣可以接受訊息。eg: 

OC程式碼  收藏程式碼
  1. person = nil;  
  2.     [person castBallot];  
  3.     NSLog(@"person = %@", person);  

     將物件置空,然後傳送訊息,程式同樣接著往下執行而不會崩潰。 


OC程式碼  收藏程式碼
  1. NSDecimalNumber *number = nil;  
  2.      NSLog(@"number = %.2f", [number doubleValue]);  


     物件以為空,獲取的資料可能已經不正確,這段程式碼將列印如下。 

     number = 0.00 

     空值處理不當是引起程式錯誤乃至崩潰的重要原因之一。 
     因為oc的集合物件,如NSArray,NSDictionary,NSSet等,都有可能包含NSNull物件,所以,如果以下程式碼中的item為NSNull,則會引起程式崩潰。 
OC程式碼  收藏程式碼
  1. NSString *item = [NSArray objectAtIndex:i];  
  2.     if ([item isEqualToString:@"test"]) {  
  3.     }  

    以下程式碼時常見的錯誤,release物件沒有設定為nil,從而引起程式崩潰。 
OC程式碼  收藏程式碼
  1. id someObj = [[Objectalloc] init];  
  2.      ...  
  3.      [someObj release];  
  4.      ...  
  5.      if (someObj) {  
  6.      }  
轉自:http://ff20081528.iteye.com/blog/1671152