nil、Nil、NULL和NSNull區別

nil、Nil、NULL和NSNull區別


對于我們Objective-C開發來說,nil就代表((void *)0)。我們使用nil表示Objective-C對象為空,如NSString *str = nil。

Nil先看看官方是如何聲明的:123456789 #ifndef Nil# if __has_feature(cxx_nullptr)#? define Nil nullptr# else#? define Nil __DARWIN_NULL# endif#endif 根據條件,

我們做Objective-C開發的,那么Nil也就是代表__DARWIN_NULL,而對于__DARWIN_NULL的聲明如下:123456789101112131415 #ifdef __cplusplus#ifdef __GNUG__#define __DARWIN_NULL __null#else /* ! __GNUG__ */#ifdef __LP64__#define __DARWIN_NULL (0L)#else /* !__LP64__ */#define __DARWIN_NULL 0#endif /* __LP64__ */#endif /* __GNUG__ */#else /* ! __cplusplus */#define __DARWIN_NULL ((void *)0)#endif /* __cplusplus */ 這個也是條件編譯的,那么對于我們Objective-C開發來說,

Nil也就代表((void *)0)。但是它是用于代表空類的。比如:123 Class myClass = Nil; NSNull先看看官方的聲明:1234567891011 NS_ASSUME_NONNULL_BEGIN @interface NSNull : NSObject+ (NSNull *)null;

@end

NS_ASSUME_NONNULL_END

由此我們可知,NSNull是繼承于NSObject的類型。它是很特殊的類,它表示是空,什么也不存儲,但是它卻是對象,只是一個占位對象

使用場景就不一樣了,比如說服務端接口中讓我們在值為空時,傳空。

NSDictionry *parameters = @{@"arg1" : @"value1",

@"arg2" : arg2.isEmpty ? [NSNull null] : arg2};

這只是隨手舉的例子,當然我們也可以不傳這人參數。如果我們要統一,比如通過runtime來動態將對象轉成我們的參數時,那么可以統一將值為nil的都設置為[NSNull null]

區別

NULL、nil、Nil這三者對于Objective-C中值是一樣的,都是(void *)0,那么為什么要區分呢?又與NSNull之間有什么區別:

NULL是宏,是對于C語言指針而使用的,表示空指針

nil是宏,是對于Objective-C中的對象而使用的,表示對象為空

Nil是宏,是對于Objective-C中的類而使用的,表示類指向空

NSNull是類類型,是用于表示空的占位對象,與JS或者服務端的null類似的含意

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容