Objective-c协议

                                                                                                                 Objective-c协议

Objective-c分为非正式协议(interface)和正式协议(protocol)。

 

非正式协议(interface)是NSObject类的类别,所有子类都接受了这个协议。类别是Objective-c的一个语言特点,类可以不子类化就为类添加新的方法。所谓非正式协议就是类别。

 

类别主要包括类别和匿名类别:

类别,我们通常称分类(category)。

分类的几条特性。

1,  可以把一个文件中的代码分散到几个分类中管理,这样可以减少一个文件的代码量,方面阅读。一般通常建议一个文件的代码量不超过500行。根据功能把一个类中的代码分散到几个分类,这样方便调用。例如,可以把类中private单独放在一个叫private的文件中,相当于告诉用户不要调用这样方法,这个方法是私有的。

2,  分类可以在不子类化的情况下为类添加新的方法,并且这个类可以被其子类继承,覆盖类原有的方法。分类的方法会在运行时加载分类的时候添加进去,如果名字相同,分类的方法会覆盖类原有的方法,并且分类的方法可能被多次覆盖。你无法知道具体被调用的是那个方法,特别是写库给别人用的时候一定要特别注意,如果你库里分类的方法和用户写的分类的方法的名字相同,将可能为用户带来麻烦,因为无法确定他最后调用的是你库里的方面还是他的方法。建议为每个分类加一个属于你的固定前缀,用以区分是你写的分类还是别人写,例如

 

 

 

#import <Foundation/Foundation.h>

 

@interface NSString (ABC_URL)

 

//encode a string with url encoding;

- (NSString *)abc_urlEncodedString;

 

//decode a url encoded string

- (NSString *)abc_urlDecodedString;

 

 

虽然不一定能绝对避免您写的方法被覆盖,但一般情况下别人所选的前缀和你选的前缀是不一样的。3

尽量避免刻意去覆盖别人的方法,特别是苹果公司提供的库,a,因为覆盖苹果公司的方法会审核非常严重,最后导致您的app无法提交。

b,如果该方法已经被其他的地方使用,如果您去覆盖他,将导致原来使用他的地方全部出现问题,甚至会引起程序崩溃。举例来说,如果你增加了NSObject中windowWillClose:的实现,这会所有的窗口调用那个新实现的,从而改变所有NSWindows实例的行为。这会带来很多确定性,并很有可能程序的崩溃。

 

3,不要在分类中添加属性(匿名类别,即class-continution分类除外)。属性是封装数据的一种方式,就是说属性就是用来封装数据的,根据相应的实例变量为类添加存取方法(getter方法和setter方法)。除了class-continution分类之外,其他的分类属性都无法为类添加实例变量,因此他无法把实现属性所需的实例变量生成出来。可以通过关联对象解决分类中不能合成实例变量的问题,但是问题太多了。

分类的机制是为了拓展类的功能,而不是封装数据,要封装数据尽量放在主接口中。

 

匿名类别 即Class-continution分类。

Objective-c动态消息系统的工作方式决定了objective-c不会有真正的私有方法,或者私有实例变量。Class-continution必须定义在类的实现文件里,它的作用是隐藏类的实例变量和方法,它是唯一能够声明实例变量的分类,声明的方法必须在定义在该分类的主现实文件里实现。分类没有名称,例如:

   @interface  EOCPerson (){

}

      -(void)addPeople(NSString*)name;

@end;

 

 

正式协议(protocol)是声明一个方法列表,为不同的类提供公共方法,这个和java中的接口有点像。Objective-c不支持多继承,而我们可以把类要实现的方法定义在协议里面。正式协议是把一套业务逻辑抽象出来,把业务和数据分离出来,只要遵循他的方法,就可以获取到里面的数据,

正式协议有两种@required@optional。分别为必须实现方法和非必须实现方法,之类能够继承父类的所遵从的协议。

 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值