OC里的NULL、nil、Nil、NSNull

在C語言里用0來作為“不存在”的原始值,而用NULL作為指針空值。OC里表示“不存在”的四種方式為:NULL、nil、NilNSNull。

NULL

NULL本質(zhì)為:(void*)0

使用慣例NULL一本用于表示C指針空值,比如:
int *a = NULL;
char *b = NULL;
struct User *userM = NULL;

當(dāng)某個(gè)API想要傳入某個(gè)指針(void *),而不是id類型時(shí),最好還是傳入NULL,以此保持了Objective-C嚴(yán)謹(jǐn)?shù)亩x。比如NSArray的這個(gè)API,argument要求的是id,所以傳入nil會(huì)比較好。

- (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(nullable id)argument

而像NSMutableArray的sortUsingFunction:context:

- (void)sortUsingFunction:(NSInteger (*)(ObjectType, ObjectType, void * __nullable))compare context:(nullable void *)context;

在這里,context傳入NULL會(huì)比傳入nil好。

nil

nil本質(zhì)為:(void*)0
nil特點(diǎn):雖然為空,仍然可以向它發(fā)送消息,在nil上調(diào)用方法都返回一個(gè)零值。

NSString *name;
NSLog(@"%p  %hhd", name, [name isEqualToString:@"CoderKo1o"]); // 0x0 0

使用慣例nil用于表示指向OC對象(id類型的對象,或者使用@interface聲明的OC對象)的指針為空,例如:

NSString *string = nil;
id object = nil;

Nil

Nil本質(zhì)也是:(void *)0

使用慣例Nil用于表示指向OC類(Class)類型的指針為空,例如:

Class someClass = Nil;
Class stringClass = [NSString class];

NSNull

NSNull是一個(gè)OC對象,是一個(gè)用于表示空值的類,只有一個(gè)單例方法:+[NSNull null],一般用于在集合對象中保存一個(gè)空的占位對象。

使用慣例:在Foundation集合對象(NSArray、NSDictionary、NSSet等)中有一個(gè)nil值得缺陷,因?yàn)檎Z法規(guī)定了這些集合是以nil為結(jié)束標(biāo)志的。因此無法用nil來存儲(chǔ)一個(gè)空值,所以一般使用[NSNull null]空對象來存儲(chǔ)。

NSArray * array = [NSArray arrayWithObjects:@"name",@"age", nil]; 
NSDictionary *dict2 = [NSDictionary dictionaryWithObjectsAndKeys:@"object",@"key",@"zhh",@"name",nil];

當(dāng)如下情況時(shí),數(shù)組里只有name和age:
NSArray * array = [NSArray arrayWithObjects:@"name",@"age", nil,@"wo",nil];

下面的使用時(shí)正確的
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNull null] forKey:@"someKey"];

日常使用

  • 判斷數(shù)組元素是否為空
NSString *element = [array objectAtIndex:2];  
if ((NSNull *)element == [NSNull null]) {

}
  • 判斷字典對象的元素是否為空
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
@"iPhone", @"First", @"iPad", @"Second", nil];

NSString *value = [dictionary objectForKey:@"First"];
if ((NSNull *)value == [NSNull null]) {

}

總結(jié)


參考文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容