这是示例代码:
NSDictionary *myDictionary = [NSDictionary dictionary];
NSNumber *myNumber = [myDictionary valueForKey: @"MyNumber"];
NSLog(@"myNumber = %@", myNumber); // output myNumber = (null)
if (myNumber == nil)
NSLog(@"test 1 myNumber == nil");
if (myNumber == NULL)
NSLog(@"test 2 myNumber == NULL");
if ([myNumber isEqual:[NSNull null]])
NSLog(@"test 3 myNumber == [NSNull null]");
什么时候应该使用无,空和[NSNull空]
Answer 1:
您可以使用nil
任何地方都可以使用null
。 主要的区别是,你可以发送邮件到nil
,所以你可以在一些地方使用它null
着的工作。
在一般情况下,只需使用nil
。
Answer 2:
他们在自己的类型不同。 他们都是零,但NULL
是一个void *
, nil
是一个id
,且Nil
是A类的指针。
Answer 3:
零是绑定/与物体(在Objective-C的ID类型)对应的一个空值。 无有没有参考/地址,只是一个空值。
NSString *str = nil;
所以,无应使用,如果我们正在处理的对象。
if(str==nil)
NSLog("str is empty");
现在NULL用于在Objective-C 非对象指针 (如C指针)。 像零 ,NULL有没有价值,也不地址。
char *myChar = NULL;
struct MyStruct *dStruct = NULL;
所以,如果有一种情况,当我需要检查我的结构 (结构型变量)为空的话,我会用:
if (dStruct == NULL)
NSLog("The struct is empty");
让我们又例如,
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
键-值观察的,上下文应该是C指针或一个对象引用。 这里我们不能用零的情况下; 我们必须使用NULL。
最后,NSNull类定义用于表示在收集对象(的NSArray,NSDictionary的)空值的单独的对象。 在[NSNull空]会返回NSNull的单一实例。 基本上[NSNull空]是一个正确的对象。
有没有办法插入一个零对象为集合类型的对象。 让我们有一个例子:
NSMutableArray *check = [[NSMutableArray alloc] init];
[check addObject:[NSNull null]];
[check addObject:nil];
在第二行,我们不会得到任何错误,因为它是完全公平的插入NSNull对象到集合类型的对象。 在第三行,我们将得到“对象不能是零”的错误。 因为零不是一个对象。
Answer 4:
NULL和零是彼此相等的,但零是对象值,而NULL是一个通用的指针值( (void*)0
,是特异性的)。 [NSNull null]
是的意思,其中零不允许站在于零的情况下一个对象。 例如,你不能在一个NSArray一个零值。 所以,如果你需要表示“无”,则可以使用[NSNull null]
。
Answer 5:
我发现以下情况:
objc.h
#define Nil __DARWIN_NULL /* id of Nil class */
#define nil __DARWIN_NULL /* id of Nil instance */
_types.h
#define __DARWIN_NULL ((void *)0)
STDDEF.H
#undef NULL
#ifdef __cplusplus
#undef __null // VC++ hack.
#define NULL __null
#else
#define NULL ((void*)0)
#endif
MacTypes.h
#ifndef NULL
#define NULL __DARWIN_NULL
#endif /* ! NULL */
#ifndef nil
#define nil NULL
#endif /* ! nil */
它的样子,有没有差异,但概念之一。
Answer 6:
要注意的是if([NSNull null])
返回true
。
Answer 7:
为了扩大从@cobbal评论:
MacTypes.h包含:
#ifndef nil
#define nil NULL
#endif
Answer 8:
他们都只是强制转换零。 在功能上,两者其实没有什么区别。 即,
#define NULL ((void*)0)
#define nil ((id)0)
是有区别的,但只有你自己,读取这些代码的其他人时,编译器不关心。
还有一个件事是为零的目标值,而NULL是一个通用的指针值。
Answer 9:
在现代的OS X和iOS的SDK:
-
nil
和Nil
和NULL
是在Objective-C和在Objective-C ++之前C ++ 11相同。 -
nil
和Nil
和std::nullptr
与C ++ 11在Objective-C ++相同。
风格上,很多人都喜欢用nil
对Objective-C的对象和NULL
或nullptr
其他指针类型。 我自己现在用的nil
随处可见。
[NSNull null]
是一个单对象使用,其中在的情况下表示空值nil
是被禁止的值(通常在收集对象,如NSArray
或NSDictionary
)。 宗数和金额编程主题:使用NSNull
Answer 10:
如前所述,它们是相同的,但我请使用一个或另一个,这取决于相应的框架是书面语言。
对于一切有关Objective-C的,我用的是零。 例如:
- (BOOL)doSomethingWithObjectsInArray:(NSArray *)anArray {
if (anArray == nil) return NO;
// process elements
...
}
然而,从C-框架检查数据模型的有效性时(如通讯录框架和的CoreFoundation),我使用NULL。 例如:
- (BOOL)showABUnknownPersonVCForABRecordRef:(ABRecordRef)aRecord {
if (aRecord == NULL) return NO;
// set-up the ABUnknownPersonViewController and display it on screen
..
}
这样一来,我在我的代码微妙的线索,如果我处理的OBJ-C或基于C语言代码。
Answer 11:
有在某些情况下的差异。
从字面上看,空是一个字符:ASCII 0。
无相当于空白,没有任何价值。
根据编程背景下,这可能是一个很大的区别。
Answer 12:
当调用一个Objective-C方法类型的输出参数(NSError **)使用NULL例如。
我看到很多的例子代码在网络上,人们提供零代替空在这种情况下。 这是因为它是一个指向指针的指针,因此不直接一个Objective-C的对象类型。 正如上面所说的,零应该用于Objective-C的对象类型。
Answer 13:
零意味着不存在的值,而表示NULL没有对象,
NSArray的*阵列= @ @的 “Hello World!”,@ 101,[NSNULL空];
此处[NSNULL空]是一个对象,这意味着没有对象,在同一时间可以不加零以指示不存在的对象。
您可以同时使用零和[NSNUll空]检查过。
Answer 14:
这将帮助你了解零,零,零之间的差异。
下面的链接可以帮助你以某种方式:
http://nshipster.com/nil/
零 - >为Objective-C对象文字空值。
无 - >对Objective-C类文字空值。
NULL - >为C指针文字空值。
NSNULL - >用来表示空singleton对象。
Answer 15:
基本上:无:对象和空上空指针:是用于其它类型的指针
Answer 16:
零是一个对象指针不了了之。 虽然从NULL语义不同,他们在技术上等同于彼此。
在框架级,基金会定义NSNull,它定义一个类的方法,+ null,该返回单一NSNull对象。 NSNull是从零或NULL不同,在于它是一个实际的 对象 ,而不是一个零值。
此外,基金会/ NSObjCRuntime.h, 无被定义为一类 指针不了了之。
请参阅本作进一步的信息-零/零/空/ NSNull
文章来源: When should I use nil and NULL in Objective-C?