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