2013年11月27日日志:
1.属性:
@property(assign ,copy或retain内存管理的信息)类型 实例变量名
@synthesize 实例变量名
属性方法实现了实例变量的get和set方法,等同于:
-(void)set实例变量名:(参数类型)参数名{
实例变量名 = 参数名;
}和
-(返回值类型)实例变量名{
return 实例变量名;
}
需要注意的是属性方法不能实现那些需要接受额外参数的方法,例如car对象中轮胎的状况:
-(void)setTire:(Tire*)tire
atIndex:(int)index;
-(Tire*)tireAtIndex:(int)index;
从而说明特性不是万能的,它只支持替代-setBlah和-blah方法。属性可以减少我们所写代码的数量。使用属性方法后就可以使用点语法了,点语法只是调用实例的set和get方法的一种快捷方式。
dealie.blah=greeble;等同于[dealie setBlah:greeble];
shronk = dealie.greeble;等同于shronk = [dealie greeble];
2.协议:
声明协议:
@protocol 协议名称
@optional
方法声明列表
@required
方法声明列表
@ end
协议的所有使用者都要实现协议中的方法,其中@optional可选择实现,@required声明协议中必须实现的方法,如果不加声明的情况下默认为@required,即方法必须实现。要注意的是协议的使用不引入新的实例变量。
协议也具有动态绑定特性,比如下面的实例对象被确定为gun,就拥有了gun所拥有的所有属性:
Arm *arm = [[Arm alloc]init];//动态绑定的实现
arm.name = @"wuqi";
NSLog(@"%@的编号为 %d\n",arm.name,arm.number);
//wuqi的编号为 4
arm = gun;
NSLog(@"%@的编号为 %d\n",arm.name,arm.number);
//ak47的编号为 1
//(动态绑定)实例对象被确定为gun,就拥有了gun所拥有的所有属性,
[arm movToX:70 ToY:70];
//ak47正在移动到70,70
[arm fireToX:80 ToY:80];
//ak47正在开火到80,80
[arm play];
//ak47正在播放抢的声音!
实例对象被确定为gun,就拥有了gun所拥有的所有属性,名字和编号都变成gun的名字和编号,调用的是gun内实现的方法。
3.分类:category
@interface 需要添加方法的类名(分类名)
方法声明列表
@end
@implementation 需要添加方法的类名(分类名)
方法的具体实现
@end
用于给类添加新的方法;分类只能添加新的方法,而不能添加新的实例变量,如果想要添加新的实例变量,可以使用创建新的子类来添加新的变量。分类可以重载该类中的方法,但大家一般不经常这样使用。
分类中声明的所有方法,这是和协议很不相同的一个地方。分类使用需谨慎,因为使用分类不仅会影响类本身,还会影响到它的所有子类。