2.NSNULL,NULL和nil在本質(zhì)上應(yīng)該是一樣的,NULL和nil其實(shí)就是0,但是在Objective-c中,對于像NSArray這樣的類型,nil或NULL不能做為加到其中的Object,如果定義了一個NSArray,為其分配了內(nèi)存,又想設(shè)置其中的內(nèi)容為空,則可以用[NSNULLnull返回的對對象來初始化NSArray中的內(nèi)容,
3.因?yàn)樵贜SArray和NSDictionary中nil中有特殊的含義(表示列表結(jié)束),所以不能在集合中放入nil值。如要確實(shí)需要存儲一個表示“什么都沒有”的值,可以使用NSNull類。NSNull只有一個方法:+ (NSNull *) null;
因?yàn)镺bject-C的集合對象,如NSArray、NSDictionary、NSSet等,都有可能包含NSNull對象,所以,如果一下代碼中的item為NSNull,則會引起程序崩潰。
NSString *item=[NSArray objectAtIndex:i];if([item isEqualToString:@"TestNumber"]){ //}以下代碼是常見的錯誤,release對象沒有設(shè)置為nil,從而引起程序崩潰。id someObject=[[Object alloc] init];//...[someObject release];//...if(someObject){ //crash here}nil用來給對象賦值(Object-C的任何對象都屬于id類型),NULL則給任何指針賦值,NULL和nil不能互換,nil用于類指針賦值(在Object-C中類是一個對象,是類的meta-class的實(shí)例),而NSNull則用于集合操作,雖然它們表示的都是空值,但是使用場合完全不同,所以在編碼時嚴(yán)格按照變量類型來賦值,將正確的空值賦給正確的類型,使代碼易于閱讀和維護(hù),也不易引起錯誤。
//判斷對象不空if(object) {}//判斷對象為空if(object == nil) {}//數(shù)組初始化,空值結(jié)束NSArray *pageNames=[[NSArray alloc] initWithObjects:@"DocumentList",@"AdvancedSearch",@"Statistics",nil];//判斷數(shù)組元素是否為空UIViewController *controller=[NSArray objectAtIndex:i];if((NSNull *)controller == [NSNull null]){ //}//判斷字典對象的元素是否為空NSString *userId=[NSDictionary objectForKey:@"UserId"];if(userId == [NSNull null]){ //}Object-C有個可愛的特性,就是當(dāng)發(fā)消息給nil對象時,系統(tǒng)返回0值而不是引起異常,這和JAVA煩人的NullPointerException以及C/C++的程序直接崩潰的處理完全不一樣,明白Object-C的這個特性對于開發(fā)正確的IOS程序非常重要,因?yàn)閚il是對象的合法值,nil對象同樣可以接收消息,例如:
person=nil;[person castBallot];NSLog("person=%@",person);
對象置空,然后發(fā)送消息,程序同樣接著往下執(zhí)行而不會崩潰。
愛華網(wǎng)



