布尔类型
C里面的布尔类型bool具体true和false值,而objective-c里面提供BOOL,但它的值却是YES和NO。实际上objective-c的BOOL实际上是一种对带符号的字符类型(singed char)的定义(typedef),它使用8位存储空间,YES定义为1,而NO定义为0.objective-c并不将BOOL作为仅能保存YES或NO值的真正的布尔类型来。编译器将BOOL认做8位二进制数,如果一不小心将一个长于1字节的整形值(short或int值)赋给一个BOOL变量,那么只有低位字节会用作BOOL值,那么BOOL值将会是0,即NO值。比如该低位字节刚好为0,比如8960,写成十六进制为0x2300。
在C里面,返回一个BOOL,有的人习惯这样写,假定iA和iB为两个整数
return (iA-iB);
那么上面一句话表示,如果不为0,则返回true。但是在objective-c里面却不是,因为在objective-c里面1不等于YES。因此在使用判断的时候,绝不要直接将BOOL值与YES比较,与NO值判断较为明智。
枚举、结构体的定义
与C++里面没有多大的区别,定义如下:
枚举:
typedef enum
{
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;
结构体:
typedef struct
{
int x, y, width,height;
ShapeType type;
} Shape;
关于id的使用
在例03.10-Shapes-Object中有下面一段代码:
//--------------------------------------------------
// Draw the shapes
void drawShapes (id shapes[], int count)
{
inti;
for(i = 0; i < count; i++) {
idshape = shapes[i];
[shapedraw];
}
} // drawShapes
输入参数有一个类型为id数组对象,那么id是什么意思?它代表identifier(标识符),它是一种泛型,用于表示任何各类的对象,id实际上是一个指针,指向某种结构。
for循环里面的意思是,从id数组里面依次得到一个id对象,并赋给shape。下面一句话
[shape draw]
是什么意思呢?在objective-c里同,方括号还有一种意义:它通知某个对象该做什么。第一项是对象,第二部分是需要对象执行的操作。在objective-c里面,这种用通知对象执行某种操作称为发送消息。
类的声明、实现与实例化
下面是关于MyClass的类的接口:
@interface MyClass : NSObject
{
//MyClass的各个数据成员
int iIndex;
NSString strName;
}
- (void) setIndex : (int) index;
- (void) setName : (NSString*) name;
- (void) print : (int) index: (NSString*) name;
@end //MyClass
@interface MyClass :NSObject 表明这是MyClass的定义部分,继承于NSObject。
- (void) setIndex : (int) index;
方法的定义:“-”表示这是objective-c方法的声明,(void)表示方法类型, “:”表示函数带有参数,(int)是参数类型, index为参数名称, “;”表示方法声明结束。
如果方法带有两个参数,如print方法,那么两个参数中间用“:”来进行隔开。
@end表示类接口定义结束,而后来的注释则是一种标记,标记MyClass定义在此结束
MyClass的实现部分:
@implementation MyClass
- (int) setIndex : (int) index
{
iIndex = index;
} //setIndex
- (void) setName : (NSString*) name
{
strName = name;
} // setName
- (void) print : (int) index: (NSString*) name
{
NSLog(@"the %d 's name is %@",index, name);
@end //MyClass
@implementation是一个编译器指令,表示即将为MyClass提供代码,直到@end结束。中间的方法实现可以根据interface里面的定义来进行依次实现,也可以编写interface里面没有出现的方法。
以下的代码用来实例化MyClass这个类,并调用其方法:
MyClass myObj = [MyClass new];
[myObj setName: @"oneName"];
[myObj print: 5: @"oneName"];
继承
什么是继承?继承的好处是什么?这里就不再介绍了,不懂的就找本面向对象的书重新学习一下。
在objective-c里面,继承的语法如下:
@interface MyClass :NSObject
冒号后的标识 符是需要的继承的类,在objective-c中只能实现单继承。
举例:类A继承于类B
超类:类B就可以称为类A的超类,也称为父类;
子类:类A是类B的子类,也称为孩子类。
继承的工作机制:
类A继承于类B,类A有存在一个方法,名称暂且称为FunctionA,类B也有这么一个方法,那么调用类B的方法FunctionA时,则会执行类B本身的方法,而不是类A里面的,因为类A的这个方法已经被类B所重写了。
如果调用类B未重写类A的方法时,则编译器会先在类B中进行查找,如果没有重写,则到类B的超类,也就是类A中去进行查找,直到找到为止。
如果类B重写了类A中的方法FunctionA,但类B的FunctionA中还想调用其超类的方法,那么就要用到Super这个关键字了,如下所示
@implementation ClassB
- (void) FunctionA : (int) iValue
{
if(iVaule == 5)
iValue =10;
[super FunctionA: iValue];
}
@end
复合
编程中的复合就好像音乐中的作曲一样:将多个组件组合在一起配合使用,从而得到完整的作品。这里没有什么好讲的。
但照着书上进行编码“05.01CarParts”之后会出现一个问题,就是当你点击Run按钮后,程序在输出Engine之后,会在Tire的Description函数后面停顿,然后会出现一个“Thread 1:Stopped at breakpoint 1”的提示,刚开始碰到这个的时候,我也不知道什么原因,后来不断的摸索,其实这并不是一个BUG,代码本身没问题,但是执行的时候不知道为什么在这里停顿了,注意,我说的是停顿,那么办法就是让它继续执行,点击菜单“Product”->“Debug”->“Continue”然后继续执行就可以了。
继承在对象间建立了“is a”的关系,也就是说当A是一个B时,那么它们之间的关系是继承。
复合,则是一种“has a”的关系,如果A有一个B时,那么它们之间的关系是复合。