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類似的含意