oc基础知识:属性、协议和分类

20131127日日志:

1.属性:

@propertyassign copyretain内存管理的信息)类型  实例变量名

@synthesize  实例变量名

属性方法实现了实例变量的getset方法,等同于:

-(void)set实例变量名:(参数类型)参数名{

实例变量名 参数名;                      

}和

(返回值类型)实例变量名{

return  实例变量名;

}

需要注意的是属性方法不能实现那些需要接受额外参数的方法,例如car对象中轮胎的状况:

-(void)setTire:(Tire*)tire

            atIndex:(int)index;

-(Tire*)tireAtIndex:(int)index;

从而说明特性不是万能的,它只支持替代-setBlah-blah方法。属性可以减少我们所写代码的数量。使用属性方法后就可以使用点语法了,点语法只是调用实例的setget方法的一种快捷方式。

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

用于给类添加新的方法;分类只能添加新的方法,而不能添加新的实例变量,如果想要添加新的实例变量,可以使用创建新的子类来添加新的变量。分类可以重载该类中的方法,但大家一般不经常这样使用。

分类中声明的所有方法,这是和协议很不相同的一个地方。分类使用需谨慎,因为使用分类不仅会影响类本身,还会影响到它的所有子类。  

发布了32 篇原创文章 · 获赞 6 · 访问量 6万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章