首页 > 代码库 > 分类和协议
分类和协议
1.分类
- 分类的概念
分类是objective-c特有的一种属性,其他编程语言没有类似的模块。分类是为了给现有的类基础上增加某些方法,而不通过继承的方式,这种方法只能给类增加方法,不能增加成员变量,而且不会对原有的类产生影响。分类是类的补充和扩展,本质上是类的一部分,把一个类分成若干部分,每个部分就是分类。 - 分类的语法
和类的定义基本一样,只是在类名后面加一对括号及名字
* 文件中的语法:@interface 主类类名(分类类名)
* 文件名通常为:主类名+分类名
* 调用方法时,只需要向主类引用放送消息即可 - 分类的性质
* 分类不但可以给自定义的类添加功能,还可以给不知道源代码的类添加功能。比如NSString添加一个具体网络访问功能(访问服务器)
* 在分类中,不可以定义实例变量,也不可以定义属性,可以访问对象的属性。
* 在运行时,分类中的方法与类原有的方法并无区别,其代码可以访问包括私有类成员变量在内的所有成员变量。
* 若分类声明了与类中原有方法同名的函数,则分类中的方法会被调用。因此分类不仅可以增加类的方法,也可以代替原有的方法。这个特性可以用于修正原有代码中的错误,更可以从根本上改变程序中原有类的行为。若两个分类中的方法同名,则被调用的方法是不可预测的。
* 通常来讲,分类是定义在.h文件中,但也可以定义.m文件中,此时分类的方法就变成私有方法。
* 使用分类时,包含分类定义的头文件即可
2.协议
- 协议的概念
协议有点类似于C++里面的虚类以及Java里面的接口,但是协议不能定义变量,只能定义函数。协议是定义一个规则,要求实现该协议的子类实现协议中定义的规则,其中有些规则是可选的。 - 协议的语法
定义一个协议:
@protocol协议名
@required声明必须遵守的属性和方法
@optional声明可选的属性和方法
默认@required
一个类遵守(使用)一个协议:
@interface 类名(分类名):父类名 <协议名> - 协议的性质
一个类可以同时遵守多个协议,协议之间用","号分开多个协议时,使用类似<protocol1,protocol2>这样的形式
3.示例
- 协议文件
// // Animal.h // CategoryProtocol // // Created by God Lin on 14-11-26. // Copyright (c) 2014年 hust. All rights reserved. // #ifndef CategoryProtocol_Animal_h #define CategoryProtocol_Animal_h // 定义协议 @protocol Animal <NSObject> // default is required @required -(void)showName; @optional -(void)showOptional; @end #endif
- 分类定义文件
// // Cat+speak.h // CategoryProtocol // // Created by God Lin on 14-11-26. // Copyright (c) 2014年 hust. All rights reserved. // #import <Foundation/Foundation.h> #import "Cat.h" // 定义分类,注意语法,且只能写方法 @interface Cat (speak) -(void)speak; @end
- 分类实现文件
// // Cat+speak.m // CategoryProtocol // // Created by God Lin on 14-11-26. // Copyright (c) 2014年 hust. All rights reserved. // #import "Cat+speak.h" // 实现分类,能直接访问类属性 @implementation Cat (speak) -(void)speak { NSLog(@"%@ : 喵喵", name); } @end
- 示例类的定义
// // Cat.h // CategoryProtocol // // Created by God Lin on 14-11-26. // Copyright (c) 2014年 hust. All rights reserved. // #import <Foundation/Foundation.h> #import "Animal.h" // 类实现协议 @interface Cat : NSObject <Animal> { NSString* name; } @property NSString* name; -(void)showName; @end
- 示例类的实现
// // Cat.m // CategoryProtocol // // Created by God Lin on 14-11-26. // Copyright (c) 2014年 hust. All rights reserved. // #import "Cat.h" @implementation Cat @synthesize name; -(void)showName { NSLog(@"%@", name); } @end
- main文件
// // main.m // CategoryProtocol // // Created by God Lin on 14-11-26. // Copyright (c) 2014年 hust. All rights reserved. // #import <Foundation/Foundation.h> #import "Cat+speak.h" int main(int argc, const char * argv[]) { @autoreleasepool { Cat* cat = [[Cat alloc] init]; [cat setName:@"HelloKity"]; [cat showName]; [cat speak]; } return 0; }
- 输出结果
2014-11-26 22:32:45.488 CategoryProtocol[1741:303] HelloKity 2014-11-26 22:32:45.490 CategoryProtocol[1741:303] HelloKity : 喵喵
分类和协议
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。