您的位置:首页 > 其它

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

2013-11-27 20:54 183 查看
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

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

分类中声明的所有方法,这是和协议很不相同的一个地方。分类使用需谨慎,因为使用分类不仅会影响类本身,还会影响到它的所有子类。  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  属性协议分类