什么时候应该使用Objective-C的零和NULL?(When should I use nil

2019-07-23 14:16发布

这是示例代码:

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:

  • nilNilNULL是在Objective-C和在Objective-C ++之前C ++ 11相同。
  • nilNilstd::nullptr与C ++ 11在Objective-C ++相同。

风格上,很多人都喜欢用nil对Objective-C的对象和NULLnullptr其他指针类型。 我自己现在用的nil随处可见。

[NSNull null]是一个单对象使用,其中在的情况下表示空值nil是被禁止的值(通常在收集对象,如NSArrayNSDictionary )。 宗数和金额编程主题:使用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?