Objective-C之入门语法篇

布尔类型

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);

} //print

@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时,那么它们之间的关系是复合。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值