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

你可能感兴趣的:(nil、Nil、NULL和NSNull区别)