您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > OC中的类别Category-协议Protocol-扩展Extension
1/4OC中的类别Category-协议Protocol-扩展ExtensionOC中的类别Category-协议Protocol-扩展Extension类别(category)——通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中。通常只在类别中定义方法。类别,接口部分的定义,通常该文件命名为已有类+类别名.h@interface已有类(类别名)//.......方法实现@end#importFoundation/Foundation.h#importBuy.h@interfacePerson:NSObjectBuy-(void)eat;@end实现如下:#importPerson.h@implementationPerson-(void)buy//实现协议方法{NSLog(@Buysomething---ProtocolMethod);}//这是一个公有方法,因为在.h有声明,第三方也可以用。-(void)eat{NSLog(@I'meating-PersonClass);}//这是一个私有方法。因为只在.m文件中定义,而没有在.h文件中声明-(void)playFootball{NSLog(@Bobplayingfootball--PrivateMethod);}2/4OC中的类别Category-协议Protocol-扩展Extension@end例如,考虑为Person增加一个类别,则接口部分代码如下#importFoundation/Foundation.h@interfacePerson(OtherMethod)-(void)sleep;@end该类别的实现部分如下#importPerson+OtherMethod.h@implementationPerson(OtherMethod)-(void)sleep{NSLog(@I'msleeping--Category);}@end所有Person类的实例就都会具有sleep方法,从而实现对Person类的动态扩展。我们知道,如果一个函数在.h文件中无声明而在.m文件中定义它的实现,那么该方法就是私有方法,只能在本类的文件中使用。若我们在类别的接口部分声明这个方法,那么我们就可以实现对该私有方法的访问。—————————————————————————————————————————————————————————————————————————————扩展(extension)扩展与类别相似,扩展相当于匿名类别,即没有类别名的类别类别,接口部分的定义,通常该文件命名为已有类_xxx.h@interface已有类()//.......方法实现@end3/4OC中的类别Category-协议Protocol-扩展Extension在用法上,类别通常都都有单独的.h和.m文件。扩展则是临时的对某个类进行扩展,类的实现部分同时实现类接口部分定义的方法和扩展中定义的方法。定义类的扩展时,可以增加额外的实例变量,也可使用@property和@synthesize关键字,但在定义类的额外列表时不允许额外定义实例变量。有类名为Vehicle,只有name属性没有定义方法。对其进行扩展#importvehicle.h@interfaceVehicle()@property(nonatomic,strong)NSString*color;-(void)drive:(NSString*)name;@end为原来的Vehicle类增加color属性和drive:方法,因此在Vehicle.m实现文件里面要实现Vehicle.h里声明的方法及这个drive:方法。//Vehicle.m#importVehicle_ext.h@implementationVehicle-(void)drive:(NSString*)name{NSLog(@交通工具名称%@,颜色属性%@,_name,_color);}@end在实际使用中,通用的做法是省略掉Vehicle_ext.h文件,而是将其中的内容直接添加在Vehicle.m文件@implementation前部即可。—————————————————————————————————————————————————————————————————————————————协议(protocol)以NSObject为基础,为NSOject创建类别,创建类别时指定该类新增的方法,既可以实现非正式协议。而OC中对于实现非正式协议的类而言,OC并不强制实现该协议中的所有方法。4/4OC中的类别Category-协议Protocol-扩展Extension正式协议使用@protocol关键字定义@protocol协议名父协议1,父协议2{//.....方法声明}@end协议是支持多继承的。在OC2.0标准中新增了@required\@optional两个关键字,声明方式是必须是必须实现还是可选的,默认为@required.遵守协议的语法如下@interface类名:父类型协议1,协议2...使用协议来定义变量,那么这些变量只能调用该协议中声明的方法,否则编译器会提示错误。使用协议来定义变量的两种语法NSObject协议1,协议2..*变量名;id协议1,协议2...变量;协议体现的是一种规范,定义协议的类可以把协议定义的方法委托(delegate)给实现协议的类,这样可以让类具有更好的通用性,具体的动作交给协议的实现类来完成。在大量的应用程序开发中大量依赖委托这个概念。
本文标题:OC中的类别Category-协议Protocol-扩展Extension
链接地址:https://www.777doc.com/doc-2890056 .html