那么其实很多朋友可能会纳闷儿,你不是要学IOS开发么?那么直接去学就好了,抄呗,拖拖控件,写几行代码就好了啊,好吧,其实这个也算是个捷径,但很多时候要想做好,还是说,基础要打牢,所以,废话不多讲,开始今天的学习。
今天我们主要来看下Obj-C的数据类型和表达式
一、 数据类型
Obj-C是C语言的超集,之前我们都知道了,所以Obj-C中的数据类型分为两种:一种是基于C语言的基本数据类型;另一种是Obj-C特殊的数据类型。
1. C语言基本数据类型
Obj-C基于C语言的基本数据类型有:int,float,double和char,那么我们来看下书上的一个比较全面的例子,包括各个类型的赋值和输出。
#import
int main (int argc,char *argv[])
{
NSAutoreleasePool * pool=[[NSAutorreleasePool alloc] init]; //声明对象释放池
int integerVar=100; //声明int变量
float floatingVar=331.79; //声明float变量
double doubleVar=8.44e+11; //声明double变量
char charVar='W'; //声明char变量
NSLog (@"integerVar=%i",integerVar); //使用NSLog函数输出
NSLog (@"floatingVar=%f",floatingVar); //使用NSLog函数输出
NSLog (@"doubleVar=%e",doubleVar); //使用NSLog函数输出
NSLog (@"doubleVar=%g",doubleVar); //使用NSLog函数输出
NSLog (@"charVar=%c",charVar); //使用NSLog函数输出
[pool drain]; //释放对象释放池
return 0;
}
那么上面这个例子的最终输出结果为:
integerVar=100
floatingVar=331.79009
doubleVar=8.440000e+11
doubleVar=8.44e+11
charVar='W'
还有一些C语言里也有的数据类型:
Long型
Long long型
Short型
Unigned型
signed型
2. Obj-C的特殊数据类型
除了上面列出的常用数据类型以外,Obj-C还提供了几个比较特殊的数据类型:id、BOOL、nil、SEL、YES和NO
(1)在Obj-C中id可以用来标识任何类的对象,那么实际上id是一个指针(这个地方原谅我照本宣科吧,没学过C语言的孩纸桑不起啊)并且指向一个类结构提,定义如下所示:
Typedef struct objc_object{
Class isa;
}*id;
那么我们可以把id当成C语言的void*来理解,可以用它来映射任何对象类型,并且可以给它传任何消息,如果传递给它的消息它不支持的话,就会返回异常。我们还是参照书上的一个例子来看下id的用法:
id object; //声明一个id类型的对象
object=[[Car alloc] init];//实例化一个Car的对象并且传递给object,此时object是Car的对象
[object run]; //调用Car的run方法
object=[[Bike alloc] init]; //实例化一个Bike对象并传递给object,此时object是Bike的对象
[object run]; 调用Bike的run方法
(2)BOOL类型等同于C/C++中的bool类型,即其值只能是真(true)或假(false)。
BOOL类型的定义如下:
Typedef signed char BOOL
Obj-C中的真和假的关键字是YES和NO,其实也就相当于我们常用的其他语言中的true和false。
YES和NO的定义如下:
#define YES (BOOL) 1
#define YES (BOOL) 0
那么我们还是看一个实例:
BOOL isFinished=NO;//声明一个BOOL变量并赋初始值为假
if(isFinished) //如果为真就执行括号中的语句
{
}
isFinished=YES; //将isFinished变量赋值为真
if(isFinished) //此时isFinished为真,执行下面括号里的语句
{
}
(3)nil代表一个空对象,相当于我们其他语言里的NULL,在Obj-C中nil表示一个Objective-C对象的指针指向空,我们看一个实例:
Car * myCar=nil;//声明一个Car的变量并且赋值为空,此时myCar相当于空对象
if(myCar) //判断myCar对象是否为空,如果为空就执行startEngine方法
{
[myCar startEngine];
}
那么如果我们直接去掉if判断条件,在Obj-C中是不会做任何操作的,因为Obj-C中如果一个空对象调用任何方法,都是不会做任何操作的,但是像其他的语言中,比如C\C++\Java\C#等,这样儿做是会报错的。
(4)SEL是selector的一个类型,,代表一个方法,等同于C语言中的函数指针,下面的这个例子说明SEL是如何使用的。
SEL oneMethod=@selector(render);//声明一个SEL变量,并且赋值为方法render的指针
[oneObject performSelector: oneMethod];//假设oneObject已经实例化,执行render方法
@select关键字是Obj-C语言中专属的关键字,作用就是得到一个方法指针。上面的例子中传入名字为render的方法,使得oneMethod成为指向render方法的指针。oneObject假设是已经实例化的对象,通过调用performSelector方法来执行render方法,那么这里的performSelector方法是NSObject类中实现的方法,因为每个Obj-C类都是继承自NSObject类,所以所有实例化之后的对象都可以调用此方法。
二、 运算表达式
Obj-C中基本的运算表达式和其他的语言没有什么太大的差别,加减乘除以及取余等,基本的规则也一样,先左后右,高级运算符优先于低级运算符,这里就不再一一赘述了。
OK,今天就先学到这里,其实还是那句话,有过编程经验的话,再学习一门新的语言并不是什么难事儿,我个人感觉到目前为止,Obj-C中让我不太理解的就是BOOL类型、YES和NO,这点儿我会再仔细去查阅相关的资料看一下,或者请教一下身边的IOS开发者。
2013年04月16日,Eric.Tang 记