id
id是指向Objective-C对象的指针,等价于C语言中的void*,可以映射任何对象指针指向他,或者映射它指向其他的对象。常见的id类型就是类的delegate属性。
SEL
SEL类型是Objective-C用来定义方法的关键字,但却从不属于任何类实例,其值是通过@selector进行计算,可以把她当做一个函数指针来使用,但实际上的类型是const char*。SEL类系可以在编译时通过@selector()直接创建,也可以用NSSelectorFromString()函数创建,这个函数允许通过名字调用方法,代码如下:
- [object performSelector:@selector(doSometing)];
等价于:
- [object doSometing];
Objective-C的对象可以接受任何消息,当不一定能够响应消息,所以在编码中通常可以通过respondsToSelector()函数判断对象是否可以相应某个消息,从而保护代码:
- NSString *childSelectorName = [NSString stringWithFormat:@"add%@",aKey];
- SEL chilidSelector = NSSelectorFormString(childSelectorName);
- if([self repondsToSelector:chilidSelector]){
- [self performSelector:chilidSelector withObject:aChild];
- }
如果不进行保护,而对象没有相应的方法进行响应,程序就会跑出运行时异常。
BOOL
在Objective-C中的布尔类型是BOOL,其值可以使YES或NO,也可以赋值为TRUE和FLASE。YES和TRUE等价,都是非零值;NO和FALSE等价,都是零值。子啊调用时候可以通过打印数字的方式输出其值,代码如下:
- NSString *childSelectorName = [NSString stringWithFormat:@"add%@",aKey];
- SEL chilidSelector = NSSelectorFormString(childSelectorName);
- if([self repondsToSelector:chilidSelector]){
- [self performSelector:chilidSelector withObject:aChild];
- }
nil,NULL和NSNull
注意:控制处理不当是引起程序错误乃至崩溃的重要原因之一。
因为Objective-C的集合对象,如NSArray,NSDictionary,NSSet等,都有可能包含NSNull对象,所以,如果一线代码中的item为NUNull,则会引起程序崩溃:
- NSString *item = [NSArray objectAtIndex:i];
- if([item isEqualToString:@"TestNumber"]){
- //
- }
以下代码是常见的错误,release对象没有设置为nil,从而引起程序崩溃。
- id someObject = [[Object alloc] init];
- //...
- [someObject release];
- //...
- if(someObject){
- //crash here
- }
nil用来给对象赋值(Objective-C的任何对象都属于id类型),NULL则给任何指针赋值,NULL和nil不能互换,nil用于类指针赋值(在Objective-C中类的一个对象,是类的meta-class的实例),而NSNull则用于结合操作,虽然他们表示的都是控制,但使用场合完全不同,所以在编码时严格按照变量类型来赋值,将正确的空值赋给正确的类型,是代码易于阅读和维护,也不易引起错误。
Objective-C有个特性,就是当发送消息给nil对象时,系统返回0值而不是引起异常,因为nil是对象的合法值,nil对象同样可以接受消息。
nil
nil 是 ObjC 对象的字面空值,对应 id 类型的对象,或者使用 @interface 声明的 ObjC 对象。
Nil
Nil 是 ObjC 类类型的书面空值,对应 Class 类型对象。
NULL
NULL 是任意的 C 指针空值。
NSNull
NSNull 是一个代表空值的类,是一个 ObjC 对象。实际上它只有一个单例方法:+[NSNull null],一般用于表示集合中值为空的对象。
1.nil
指向一个对象的指针为空在objc.h中的定义如下所示:
在Objective-C中用于id类型的对象
NSString *name = nil;
NSURL *url = nil;
id object = nil;
2.Nil
指向一个类的指针为空 定义如下:
在Objective-C中用于Class类型的对象
Class aClass = Nil;
Clsss bClass = [NSURL class];
3.NULL
指向C类型的指针为空在stddef.h中定义如下:
多用于如下例子:
int *pInt = NULL;
char *chChar = NULL;
struct stStruct = NULL;
4.NSNull
在Objective-C中是一个类,只是名字中有个Null,NSNull有 + (NSNull *)null; 单例方法,多用于集合(NSArray,NSDictionary)中值为空的对象
NSArray *array = [NSArray arrayWithObjects:
[[NSObject alloc] init],
[NSNull null],
@"aaa",
nil,
[[NSObject alloc] init],
[[NSObject alloc] init], nil];
NSLog(@"%ld", array.count); // 输出 3,NSArray以nil结尾
NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:
@"Object0", @"Key0",
@"Object1", @"Key1",
nil, @"Key-nil"
@"Object2", @"Key2",
nil];
NSLog(@"%@", dictionary); // 输出2个key-value,NSDictionary也是以nil结尾
NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] init];
[mutableDictionary setObject:nil forKey:@"Key-nil"]; // 会引起Crash 就是遇到未知问题,那个程序运行出错退出了。crash是崩溃的意思[mutableDictionary setObject:[NSNull null] forKey:@"Key-nil"]; // 不会引起Crash
所以在使用时,如下方法是比较安全的
[mutableDictionary setObject:(nil == value ? [NSNull null] : value)forKey:@"Key"];