Objective-c协议
2014-11-19 19:01
162 查看
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。分别为必须实现方法和非必须实现方法,之类能够继承父类的所遵从的协议。
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。分别为必须实现方法和非必须实现方法,之类能够继承父类的所遵从的协议。
相关文章推荐
- objective-c基础语法学习之--(5):类目,延展,协议,代理
- Learn Objective‐C,学习笔记04 协议(Java中的接口,c中的纯虚函数)
- objective-c协议
- Objective-C--- 多态 、 协议
- Objective-C 【Category-非正式协议-延展】
- Objective-C( Category 分类,非正式协议,分类延展)
- iOS学习笔记56(Runtime)-Objective-C Runtime 运行时之五:协议与分类
- Objective-C Runtime 运行时之五:协议与分类
- Objective-C协议和委托
- 如何在 Objective-C 中实现协议扩展
- 使用_ObjectiveCBridgeable协议实现Objective-C类与Swift结构体的无缝互转
- 从C#到Objective-C,循序渐进学习苹果开发(3)--分类(category)和协议Protocal的理解
- [Objective-C] 006_Protocol(协议)
- IOS开发系列--Objective-C之协议、代码块、分类
- Objective-C /iphone开发基础:协议(protocol)
- iOS开发系列--Objective-C之协议、代码块、分类
- Objective-C的分类和协议
- IOS开发系列--Objective-C之协议、代码块、分类
- Objective-C Category 、 Extension 、 非正式协议 及Block的使用
- Objective-C ,ios,iphone开发基础:protocol 协议(委托,代理)的声明