Objective-C中nil,NIL和null之间的区别
我想知道nil , NIL和null之间的区别。 我search了一下,发现这个:
nil – >指向Objective-C对象的空指针
NIL – >指向Objective-C类的空指针
null – > null指向原始types或不存在数据的指针
但是我无法清楚地理解“Objective-C对象”和“类”这两个术语。
请给我解释一下。 另外,Objective-C中是否有像NSNull或NSNil这样的NSNull ? 如果是这样,那么请解释它是什么。
nil是Objective-C对象的文字空值,对应于抽象typesid或通过@interface声明的任何Objective-Ctypes。 例如:
NSString *someString = nil; NSURL *someURL = nil; id someObject = nil; if (anotherObject == nil) // do something
Nil是Objective-C类的字面空值,对应于typesClass 。 由于大多数代码不需要variables来引用类,所以它的使用并不常见。 一个例子是:
Class someClass = Nil; Class anotherClass = [NSString class];
NULL是任意C指针的文字空值。 例如,
int *pointerToInt = NULL; char *pointerToChar = NULL; struct TreeNode *rootNode = NULL;
NSNull是表示null的对象的类。 实际上,只有一个对象,即+[NSNull null]返回的对象。 它与nil不同,因为nil是一个文字空值,即它不是一个对象。 另一方面, NSNull的单一实例是一个适当的对象。
NSNull通常用于Foundation集合,因为它们不能存储nil值。 在字典的情况下, -objectForKey:返回nil表示给定的键在字典中没有对应的对象,即该键没有被添加到字典中。 如果你想明确说明你有一个特定的键,但是它还没有值,你可以使用[NSNull null] 。
例如,下面的代码会抛出一个exception,因为字典不能存储nil值:
NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setObject:nil forKey:@"someKey"];
另一方面,下面的代码是有效的,因为[NSNull null]是一个非零对象:
NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setObject:[NSNull null] forKey:@"someKey"];
值得一提的是,基础集合的初始化程序使用nil作为对象列表末尾的标记,而不必指定列表中元素的数量。 这只能发生,因为无法存储在基金会collections。 例如,
NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];
至于NIL或NSNil ,在Objective-C或Apple基金会中没有这样的事情。
我不确定,但是我认为nil只能用来代替id ,Java和C ++程序员会认为它是pointer object的pointer 。 对非对象指针使用NULL 。
nil通常用于Objective-C对象types,而NULL用于c样式指针
假设你有一个MyClass类,那么按照惯例,如果你想将它的实例初始化为null值(和java中的null相同),
MyClass *obj = nil;
如果你想初始化一个基本指针为空值(与c中相同)你使用
int *ptr = NULL;
如果你想初始化为空值的Class引用(与Java中的null相同),则使用
Class classRefOfMyClass = Nil;
这只是一个惯例,否则零或零具有相同的含义,也许NULL,零或零都是相同的。
这里是objc.h文件中的这些定义
#ifndef Nil # if __has_feature(cxx_nullptr) # define Nil nullptr # else # define Nil __DARWIN_NULL # endif #endif #ifndef nil # if __has_feature(cxx_nullptr) # define nil nullptr # else # define nil __DARWIN_NULL # endif #endif
并在stddef.h
#define NULL ((void*)0)
在_types.h定义_types.h
#define __DARWIN_NULL ((void *)0)
所以逻辑上没有区别。 这里的主要思想是将C或Objective-C的指针初始化为0 。 如果你有C知识,那么你可以分配
int *ptr = 0;
没有types铸造0到指针。 因为您不需要强制转换0来将其分配给指针。
总之,他们都是0 ,没有别的。
零,零和零。 取决于你的要求。
NSNull
像NSArray和NSDictionary集合不能包含零值。
NSMutableDictionary *MymutableDictionary = [NSMutableDictionary dictionary]; MymutableDictionary[@"someKey"] = [NSNull null]; // Sets value of NSNull singleton for "someKey" NSLog(@"Keys: %@", [mutableDictionary allKeys]);
零
所有指向其他对象的指针都以nil开头,所以没必要在init方法中设置self。(association)= nil。
在其他语言中,如C ++,这会使你的程序崩溃,但是在Objective-C中,在nil上调用一个方法会返回一个零值。
if (name != nil) { ........ }
符号值的含义
nil(id)0 Objective-C对象的空值
Objective-C类的Nil(Class)0 null null值
零,零和零用于下面
1>目标c类为零
对于Objective C对象,2> nil
3> C指针为空
例:
1> A类=无;
2> NSString strName = nil;
3> char * pointerChar = NULL;
这将帮助你理解nil,NIL和null之间的区别。
所有这三个值表示空值或零指针值。 不同的是,尽pipeNULL表示任何指针为零,但 nil是特定于对象的 (例如id),而Nil是特定于类指针的。 在正确的情况下使用正确的空对象作为logging的目的应该被认为是一种最佳实践,即使没有任何东西阻止某个人混合和匹配。
下面的链接可能会以某种方式帮助你:
以下是链接中的一些重要部分:
