iOS——延展、类目、代理协议
2015-12-03 11:06
567 查看
类目
应用对现有的类添加扩展,如:系统中的类,在类目中添加的方法会被子类继承,而且运行时跟其他的方法没有区别。
作为子类的替代方式,不需要定义和使用一个子类,可以通过类目直接向已有的类目里添加方法。
对类中的方法进行归类,利用catigopry把一个庞大的类划分为小块来分别进行开发,从而更好地对类中的方法进行更新和维护。
通过类目添加的方法会成为原始类 的一部分
注意:
当然也有使用Category是需要注意的问题:
1、Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现。
2、Category可以重载原始类的方法,不大不推荐这么做,这样会覆盖掉原始类的方法。如果确实要重载,那就通过继承创建子类来实现。
3、和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。
命名方式: 类名+扩展方法
如“UIAlertView+AFNetworking”。类目的接口声明与类的定义十分相似,但类目不继承父类,只需要带有一个括号,表明该类目的主要用 途。
Category 与SubClass 区别
分类 | Category | SubClass |
---|---|---|
功能 | 只能为类添加方法 | 既能为类添加方法,又能添加变量 |
特点 | 新添加的方法会成为原始类的一部分,能被子类继承 | 新添加的方法只有子类才有,父类不具有子类才能调用,如果项目开发到尾声 |
使用 | 使用原始类的实例(-方法)或者原始类(+方法)调用方法 | 使用子类添加了方法,需要对已写代码做类型的替换(将父类替换为子类) |
类目.h文件 #import <Foundation/Foundation.h> //类目 在类目中不能添加实例变量 @interface NSString (CSayHi) -(void)sayHi;//类目的方法 @end
类目.m文件 #import "NSString+CSayHi.h" @implementation NSString (CSayHi) -(void)sayHi{//类目方法的实现 NSLog(@"这是类目提供的方法,字符内容是%@",self); } @end
使用
#import <UIKit/UIKit.h> #import "NSString+CSayHi.h" - (void)viewDidLoad { [super viewDidLoad]; NSString *str=@"hello";//定义一个字符串对象并赋值 [str sayHi];//调用类目方法 }
延展
延展是特殊形式的类目延展中定义的方法在类本身中实现
延展定义的是自己的类,必须有源代码的类
延展写在.m文件上
延展不提供名称表示方法必须实现,提供名称可以不实现
作用
定义类的私有方法,管理类的私有方法
实现
形式和类目相同,不用新创建文件,只是把类目的interface地方的文件放在了你需要扩展的类的.m文件里边。
#import "Student.h" @interface Student (extension)//为Student类创建一个私有的方法text -(void)text; @end @implementation Student -(void)hello; { [self text]; } -(void)text { NSLog(@"你好"); } @end 外界 [student hello]的时候就会打印出“你好”。但是在外界不能调用text方法,[student text]是不对的。只能在.m文件里边通过self来调用私有方法text。隐藏了内部的实现。
协议
1.协议声明了可以被其他的类实现的方法。协议本身并不会去实现。协议就是一套标准,接受协议的对象负责实现2.协议不是类,只是一个其他对象可以实现的接口。
代码
实现
oc的协议由@protocol声明的一组方法列表
要求其他的类去实现,相当于@interface部分的声明
@protocol 协议名称
// 必须实现的协议方法
@required
// 可选实现
@opyional
@end
代理模式
即本身不做实际的事情,而要求其他人去做
需要做事情的对象
1. 设置代理
2. 遵守协议
3. 实现协议方法
代码:
看实际代码 我们要求一个学生对服务员制定一个协议
学生类的.h文件 //首先我们创建一个学生的类 #import <Foundation/Foundation.h> //学生的协议内容的声明 @protocol roomServer <NSObject> @required//必须要实现的 -(void)check;//结账声明 @optional//不是必须要实现的 -(void)tackClothes;//拿衣服 @end @interface Student : NSObject @property(assign,nonatomic)id<roomServer> delegate;//声明属性代理()该属性遵守roomServer协议// -(void)serve;//声明方法 @end 学生类的.m文件 #import "Student.h" @implementation Student @synthesize delegate; -(void)serve{ //使用if委托给的对象是否遵守了协议 if ([self.delegate conformsToProtocol:@protocol(roomServer)]) { [self.delegate check];//服务员类的一个(代理)对象调用代理方法 [self.delegate tackClothes]; } } //制定一个服务员的类,需要服务员去遵守学生定的协议 服务员的.h #import <Foundation/Foundation.h> #import "Student.h" @interface Waiter : NSObject <roomServer>//把学生的协议引进 @end 服务员的.m文件 学生定的协议要由服务员来施行 #import "Waiter.h" @implementation Waiter -(void)check { NSLog(@"我给您结账"); } -(void)tackClothes { NSLog(@"我给您拿衣服"); } @end main文件 #import <Foundation/Foundation.h> #import "Student.h" #import "Waiter.h" int main(int argc, const char * argv[]) { @autoreleasepool { Student *stu=[[Student alloc]init];//给Student的stu对象开辟空间并赋初值 Waiter *wa=[[Waiter alloc]init];//非Waiter的wa对象开辟空间并赋初值 stu.delegate=wa;//因为要用stu对象的代理去执行学生对服务员协议的方法 [stu serve]; } return 0; }
概念理解
代理与协议的区别
代理是一种概念,协议是一种技术,代理是用协议来实现的,代理 是 2 个对象之间通讯的一种方式。 代理主要做反向传值的。实现系统的一些回调方法,比如 scrollview 滑动事件,选择照片,asi网络下载完成等.
相关文章推荐
- ios 发布账号过程
- iOS Developer Program
- iOS 开发笔记和技巧总结 (四)
- 登陆Demo--使用UserDeaults实现自动登录,传值,了解数据持久化方法
- iOS开发者账号以及各个账号的区别
- IOS-37-TableView及Cell的应用和设置详解
- iOS 开发笔记和技巧总结 (三)
- iOS NSLayoutAttributeLeft与NSLayoutAttributeLeading的区别
- IOS支付界面锁定按钮,防止支付第二次
- iOS 圆形按钮(或图片)
- iOS 开发 Pch 文件的正确使用
- [iOS进阶]Baidu Map SDK之批量请求
- ios Crash闪退日志获取和上传至服务器
- iOS TableView经常用得到
- IOS通知机制
- iOS tableView的cell的重用问题
- ios 循环遍历整个CollectionView
- iOS——@synthesize 与@dynamic 的不同
- iOS模拟器实现测试3Dtouch
- iOS 时间格式(时间格式转换)