id

id是指向Objective-C对象的指针,等价于C语言中的void*,可以映射任何对象指针指向他,或者映射它指向其他的对象。常见的id类型就是类的delegate属性。

SEL

SEL类型是Objective-C用来定义方法的关键字,但却从不属于任何类实例,其值是通过@selector进行计算,可以把她当做一个函数指针来使用,但实际上的类型是const char*。SEL类系可以在编译时通过@selector()直接创建,也可以用NSSelectorFromString()函数创建,这个函数允许通过名字调用方法,代码如下:

  1. [object performSelector:@selector(doSometing)];

等价于:

  1. [object doSometing];

Objective-C的对象可以接受任何消息,当不一定能够响应消息,所以在编码中通常可以通过respondsToSelector()函数判断对象是否可以相应某个消息,从而保护代码:

  1. NSString *childSelectorName = [NSString stringWithFormat:@"add%@",aKey];
  2. SEL chilidSelector = NSSelectorFormString(childSelectorName);
  3. if([self repondsToSelector:chilidSelector]){
  4. [self performSelector:chilidSelector withObject:aChild];
  5. }

如果不进行保护,而对象没有相应的方法进行响应,程序就会跑出运行时异常。

BOOL

在Objective-C中的布尔类型是BOOL,其值可以使YES或NO,也可以赋值为TRUE和FLASE。YES和TRUE等价,都是非零值;NO和FALSE等价,都是零值。子啊调用时候可以通过打印数字的方式输出其值,代码如下:

  1. NSString *childSelectorName = [NSString stringWithFormat:@"add%@",aKey];
  2. SEL chilidSelector = NSSelectorFormString(childSelectorName);
  3. if([self repondsToSelector:chilidSelector]){
  4. [self performSelector:chilidSelector withObject:aChild];
  5. }

 nilNULLNSNull

注意:控制处理不当是引起程序错误乃至崩溃的重要原因之一。

因为Objective-C的集合对象,如NSArray,NSDictionary,NSSet等,都有可能包含NSNull对象,所以,如果一线代码中的item为NUNull,则会引起程序崩溃:

  1. NSString *item = [NSArray objectAtIndex:i];
  2. if([item isEqualToString:@"TestNumber"]){
  3. //
  4. }

以下代码是常见的错误,release对象没有设置为nil,从而引起程序崩溃。

  1. id someObject = [[Object alloc] init];
  2. //...
  3. [someObject release];
  4. //...
  5. if(someObject){
  6. //crash here
  7. }

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中是一个类,只是名字中有个NullNSNull + (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"];

Objective-C数据类型之id,SEL,BOOL,nil,NULL和NSNull的更多相关文章

  1. Objective-c nil, Nil, NULL和NSNull的区别

    在OC中可能经常会遇到 nil,Nil,NULL和NSNull,下面分析一下之间的区别: Symbol Value Meaning NULL (void *)0 literal null value ...

  2. objective-C nil,Nil,NULL 和NSNull的小结

    nil用来给对象赋值(Object-C的任何对象都属于id类型),NULL则给任何指针赋值,NULL和nil不能互换,nil用于类指针赋值(在Object-C中类是一个对象,是类的meta-class ...

  3. OC中Nil nil NULL 和 [NSNULL null]的区别

    关于这个问题看过两三次了,但是每次过两个月脑袋里又会不清晰,索性记录一下加深一下印象. 一.nil 当一个对象置为nil时,这个对象的内存地址就会被系统收回.置空之后是不能进行retain,copy等 ...

  4. nil,Nil,NULL和NSNull的区别

  5. Objective C 中的nil,Nil,NULL和NSNull理解

    kenyo网友的原创说法是:做IOS开发的估计都对Objective-C的内存管理机制很头疼,一不小心程序就会出内存泄露,我也不例外,前几天被指针的置nil与release给搞惨了,今和大家详细解说一 ...

  6. Objective C语言中nil、Nil、NULL、NSNull的区别

    以下内容是基于搜集整理的网上资料,供参考. nil:指向Objective C语言中对象的空指针,其定义值为(id)0. Nil:指向Objective C语言中类(Class)的空指针,其定义值为( ...

  7. MySql数据库查询表信息/列信息(列ID/列名/数据类型/长度/精度/是否可以为null/默认值/是否自增/是否是主键/列描述)

    查询表信息(表名/表描述): SELECT table_name name,TABLE_COMMENT value FROM INFORMATION_SCHEMA.TABLES WHERE table ...

  8. SqlServer数据库查询表信息/列信息(列ID/列名/数据类型/长度/精度/是否可以为null/默认值/是否自增/是否是主键/列描述)

    查询表信息(表名/表描述) Value ) AS value FROM sysobjects a Where a.xtype = 'U' AND a.name <> 'sysdiagram ...

  9. Oracle数据库查询表信息/列信息(列ID/列名/数据类型/长度/精度/是否可以为null/默认值/是否自增/是否是主键/列描述)

    查询表信息(表名/表描述) Select table_Name As Name,Comments As Value From User_Tab_Comments Where table_Type='T ...

随机推荐

  1. SQLServer - 约束

    一.约束的分类 在SQLServer中,有3种不同类型的约束. 1.实体约束 实体约束是关于行的,比如某一行出现的值就不允许出现在其他行,例如主键. 2.域约束 域约束是关于列的,对于所有行,某一列有 ...

  2. 第三章 DOM

    节点的概念 5个常用的DOM方法:getElementById.getElementsByTagName.getElementsByClassName.getAttribute.getAttribut ...

  3. 时间星期农历js

    <script> var CalendarData=new Array(20); var madd=new Array(12); var TheDate=new Date(); var n ...

  4. PAT题库-1064. Complete Binary Search Tree (30)

    1064. Complete Binary Search Tree (30) 时间限制 100 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHE ...

  5. Java输入一行数据并转存到数组中

    直接看下面的代码吧!主要是split和foreach的使用 import java.io.*; import java.util.*; public class Main{ public static ...

  6. esxi 6 虚拟机安装复制

    打开VMware vSphere Client 连接到esxi服务器,选择配置-存储器, 右击存储器标识,选择浏览存储数据, 首先新建一个文件夹,用来存放系统镜像,这里新建了iso文件夹, 选择iso ...

  7. c++11新的小猫腻

    1.void*指针的使用,平时见得也很多了,至于为什么使用void* 指针,很多人有自己的见解,反正普通指针轻轻松松的转向void * 指针,但是void*指针转向其他的指针都要采用强制转换的. 2. ...

  8. PythonS12-day4学习笔记

    # 迭代器.装饰器.生成器 # 迭代器 li = [1, 3, 'he', '&'] n = iter(li) print(n.__next__()) import os, sys # 生成器 ...

  9. iOS--cell的重用机制

    对于像我们这样的初学者来说,cell重用机制是很难理解的内容,所以我们不一定非得理解,会用就行. cell的重用机制:当我们使用tableView时,系统只会创建屏幕中显示的cell的个数+1,当ce ...

  10. [WPF]GridView或DataGrid中自定义样式:依据某一列设定其对应行的样式(背景色,字体等)

    附效果照一张: 本方法使用StyleSelector来 获得依据自定义逻辑的style. ① class ConditionalStyleSelector : StyleSelector { publ ...