ObjC 里面的几个空值符号经常会让人摸不着头脑,这些基础的东西一点要弄清楚才行,以提高码农的基本素质。
nil 是 ObjC 对象的字面空值,对应 id 类型的对象,或者使用 @interface 声明的 ObjC 对象。
Nil 是 ObjC 类类型的书面空值,对应 Class 类型对象。
NULL 是任意的 C 指针空值。
NSNull 是一个代表空的ObjC 对象。实际上它只有一个单例方法:+[NSNull null],一般用于表示集合中值为空的对象。
NIL 或 NSNil:ObjC 不存在这两个符号!
NSURL *url = nil;
Class class = Nil;
int *pointerInt = NULL;
nil是一个对象指针为空,Nil是一个类指针为空,NULL是基本数据类型为空。
NSString *someString = nil;
NSURL *someURL = nil;
id someObject = nil;
if
(anotherObject == nil)
// do something
|
// objc.h
#ifndef nil
# if __has_feature(cxx_nullptr)
# define nil nullptr
# else
# define nil __DARWIN_NULL
# endif
#endif
// __DARWIN_NULL in _types.h
#define __DARWIN_NULL ((void *)0)
|
Class someClass = Nil;
Class anotherClass = [NSString
class
];
|
// objc.h
#ifndef Nil
# if __has_feature(cxx_nullptr)
# define Nil nullptr
# else
# define Nil __DARWIN_NULL
# endif
#endif
|
int
*pointerToInt = NULL;
char
*pointerToChar = NULL;
struct
TreeNode *rootNode = NULL;
|
// in stddef.h
#define NULL ((void*)0)
|
// 因为 nil 被用来用为集合结束的标志,所以 nil 不能存储在 Foundation 集合里。
NSArray *array = [NSArray arrayWithObjects:@
"one"
, @
"two"
, nil];
// 错误的使用
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:nil forKey:@
"someKey"
];
// 正确的使用
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNull null] forKey:@
"someKey"
];
|
/* NSNull.h
Copyright (c) 1994-2012, Apple Inc. All rights reserved.
*/
#import <Foundation/NSObject.h>
@interface NSNull : NSObject <NSCopying, NSSecureCoding>
+ (NSNull *)null;
@end
|
ObjC 不存在这两个符号!
+ (NSNull *) null;
因为Object-C的集合对象,如NSArray、NSDictionary、NSSet等,都有可能包含NSNull对象,所以,如果一下代码中的item为NSNull,则会引起程序崩溃。
NSString *item=[NSArray objectAtIndex:i]; if([item isEqualToString:@"TestNumber"]) { // } 以下代码是常见的错误,release对象没有设置为nil,从而引起程序崩溃。 id someObject=[[Object alloc] init]; //... [someObject release]; //... if(someObject) { //crash here }
//判断对象不空 if(object) {} //判断对象为空 if(object == nil) {} //数组初始化,空值结束 NSArray *pageNames=[[NSArray alloc] initWithObjects:@"DocumentList",@"AdvancedSearch",@"Statistics",nil]; //判断数组元素是否为空 UIViewController *controller=[NSArray objectAtIndex:i]; if((NSNull *)controller == [NSNull null]) { // } //判断字典对象的元素是否为空 NSString *userId=[NSDictionary objectForKey:@"UserId"]; if(userId == [NSNull null]) { // }
person=nil; [person castBallot]; NSLog("person=%@",person);对象置空,然后发送消息,程序同样接着往下执行而不会崩溃。