Chinaunix首页 | 论坛 | 博客
  • 博客访问: 38524
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 282
  • 用 户 组: 普通用户
  • 注册时间: 2014-01-27 16:04
文章分类
文章存档

2014年(21)

我的朋友

分类: C/C++

2014-03-03 17:26:51

OC的数据类型和C/C++的数据类型基本一致,我是从C++学过来的,发现OC里面也有一些独有的数据类型和C/C++的一些区别,现在给他们做个总结。
一、字符串

   在Objective-c中,字符串常量是由@和一对从引号括起的字符串序列。比如:@"mystring"、@"objective-c"等都是合法的字符串常量。
二、id类型
   id类型是Objective-c中一个比较独特类型。
   在概念上、类似Java中的Object类,可以转换为任何数据类型。
   换句话说,id类型的变量可以存放任何数据类型的对象。
   在内部处理上,这种类型被定义为指向对象的指针,实际上是一个指向这种对象的实例变量的指针。

   我们常常理解为id类型就是void*类型。但是它们两个还是有很大的区别。下面是id在objc.h中的定义:


[cpp]view plaincopy

    typedefstruct objc_object {  

    Class isa;  

    }*id;  


   从上面看出,id是指向struct objc_object的一个指针。也就是说,id是一个指向任何一个继承了Ojbect(或者NSObject)类的对象。需要注意的是id是一个指针,所以在使用id的时候不需要加星号,比如:


    id n=nil;

例如:


[cpp]view plaincopy

    id data;  

    data = person;  

    [data print];  

    …  

    data = person1;  

    [data put];  

    …  



三、BOOL

    在objc.h中,BOOL定义为:


[cpp]view plaincopy

    typedefsignedcharBOOL;  

    #define YES   (BOOL)1

    #define NO    (BOOL)0


    从上面的定义,我们可以发现布尔变量的值是YES和NO,或0和1.


    如:


[cpp]view plaincopy

    BOOL enable=NO;  

    enable=0;  

    if(enable == YES) …  

    if(enable) …  

    if(!enable) …  


     它类似于C语言中的TRUE和FALSE,但是只有1和0两个值。


四、SEL
   在Objective-c中,SEL是选择器(selector)的一个类型。
   选择器就是指向方法的一个指针。例如某个动作执行之后我们想让他接下来就做一个动作,就可以用sel选择器选择一个自定义的方法去执行完成后续想要完成的动作。

   例如:


[cpp]view plaincopy

    SEL sel=@selector (print);  

    ClassA *classA = [[ClassA alloc]init];  

    ClassB *classB = [[ClassB alloc]init];  

    [classA performSelector:sel withObject:nil];  

    [classB performSelector:sel withObject:nil];  

    SEL selA=@selector (print:);  

    SEL selB=@selector (print:age:);  


   在上例中sel是指向print方法的指针,没有指定它是属于哪个类。因此,不同的类中都有print方法时可以调用上面的形式进行调用。

   我们可以将SEL理解为函数指针,但它们之间并非完全一样。


五、Class
  与Java类似,你可以使用Class类来获得一个对象所属的类。如:
  Class theClass = [theObject class];       //获得theObject对象的class信息
  NSLog(@"类名是:%s",[theClass className]); //theObject对象的类名
  Class类有几个常用的方法,如判断某个对象是否为某个类(包含子类)的对象:
if( [theObject isKindOfClass:[Member class]]) {…}
  如果不想包含子类,就可以使用:

if( [theObject isMemberOfClass:[Member class]] {…}


六、nil和Nil
nil与C语言的NULL相同。在objc/objc.h中定义如下:
  #define nil 0      /* id of Nil instance */

  Nil与nil有点不一样,Nil定义一个指向空的类(是Class,而不是对象)。具体定义如下:
  #define Nil 0      /* id of Nil class */

  如:


[cpp]view plaincopy

    ClassA *classA = [[ClassA alloc]init];  

    classA = nil  

    id data;  

    data=nil;  


阅读(604) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~