什么时候应该在Objective-C中使用nil和NULL?
这是示例代码:
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]");
什么时候应该使用nil,NULL和[NSNull null]?
你可以在任何你可以使用null
地方使用nil
。 主要区别是你可以发送消息到nil
,所以你可以使用它在一些无法工作的地方。
一般来说,只需使用nil
。
他们的types不同。 它们都是零,但是NULL
是一个void *
, nil
是一个id
,而Nil
是一个Class指针。
nil是一个空的值绑定/对象(Objective-C中的idtypes)。 零没有参考/地址,只是一个空值。
NSString *str = nil;
所以如果我们正在处理一个对象,那么应该使用零。
if(str==nil) NSLog("str is empty");
现在,在Objective-C中, NULL被用于非对象指针 (如C指针)。 像零 , NULL没有价值,也没有地址。
char *myChar = NULL; struct MyStruct *dStruct = NULL;
所以如果有这样的情况,当我需要检查我的结构 (结构typesvariables)是否为空时,我将使用:
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 null]将返回NSNull的单例实例。 基本上[NSNull null]是一个适当的对象。
没有办法将nil对象插入到集合types对象中。 举个例子吧:
NSMutableArray *check = [[NSMutableArray alloc] init]; [check addObject:[NSNull null]]; [check addObject:nil];
在第二行,我们不会得到任何错误,因为将NSNull对象插入到集合types对象是完全公平的。 在第三行,我们会得到“对象不能为零”的错误。 因为零不是一个对象。
NULL和nil是相等的,但是nil是一个对象值,而NULL是一个generics指针值( (void*)0
,具体)。 [NSNull null]
是一个对象,在nil不允许的情况下表示为零。 例如,你不能在NSArray中有一个零值。 所以如果你需要表示一个“无”,你可以使用[NSNull null]
。
我发现了以下内容:
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 */
它看起来的样子,没有什么区别,只是一个概念。
注意if([NSNull null])
返回true
。
要扩展@cobbal的评论:
MacTypes.h包含:
#ifndef nil #define nil NULL #endif
他们都只是types零。 在function上,它们之间没有任何区别。 即,
#define NULL ((void*)0) #define nil ((id)0)
有一个区别,但只有你自己和其他读取代码的人,编译器不关心。
还有一件事是一个对象值,而NULL是一个通用的指针值。
在现代OS X和iOS SDK中:
- 在C ++ 11之前,Objective-C和Objective-C ++中的
nil
和Nil
和NULL
是相同的。 -
nil
和Nil
和std::nullptr
在Objective-C ++和C ++ 11中是相同的。
在风格上,许多人喜欢使用nil
对Objective-C对象和NULL
或nullptr
其他指针types。 我现在在任何地方都使用nil
。
[NSNull null]
是一个单例对象,用于在nil
被禁止作为值的情况下(通常在NSArray
或NSDictionary
等集合对象NSDictionary
)表示空值。 数量和价值编程主题:使用NSNull
正如已经提到的,它们是相同的,但是根据相应的框架所用的语言,我使用这一个或另一个。
对于与Objective-C有关的所有东西,我使用nil。 例如:
- (BOOL)doSomethingWithObjectsInArray:(NSArray *)anArray { if (anArray == nil) return NO; // process elements ... }
但是,从C框架(如AddressBook框架和CoreFoundation)检查数据模型的有效性时,我使用NULL。 例如:
- (BOOL)showABUnknownPersonVCForABRecordRef:(ABRecordRef)aRecord { if (aRecord == NULL) return NO; // set-up the ABUnknownPersonViewController and display it on screen .. }
这样,如果我正在处理基于Obj-C或C的代码,我的代码中有微妙的线索。
在一些情况下是有区别的。
从字面上看,Null是一个字符:ASCII 0。
无相当于空白,没有价值。
根据编程的情况,这可能是一个很大的区别。
当您使用types为(NSError **)的输出参数调用Objective-C方法时,使用NULL。
我在网上看到很多示例代码,在这种情况下,人们提供nil而不是NULL。 这是因为它是一个指向指针的指针,因此不是直接指向一个Objective-C对象types。 如上所述,nil应该用于Objective-C对象types。
nil表示不存在值,NULL表示无对象,
NSArray * array = @ [@“Hello World!”,@ 101,[NSNULL null]];
这里[NSNULL null]是一个对象,意思是没有对象,同时你不能添加nil来表示不存在对象。
你也可以同时使用nil和[NSNUull null]进行检查。
这将帮助你理解nil,NIL和null之间的区别。
下面的链接可能会以某种方式帮助你:
nil – > Objective-C对象的空值。
Objective-C类的Nil – > literal null值。
NULL – > C指针的文字空值。
NSNULL – >用来表示null的单例对象。