iOS——延展、类目、代理协议
来源:互联网 发布:创维云电视安装软件 编辑:程序博客网 时间:2024/06/04 19:44
类目
应用
对现有的类添加扩展,如:系统中的类,在类目中添加的方法会被子类继承,而且运行时跟其他的方法没有区别。
作为子类的替代方式,不需要定义和使用一个子类,可以通过类目直接向已有的类目里添加方法。
对类中的方法进行归类,利用catigopry把一个庞大的类划分为小块来分别进行开发,从而更好地对类中的方法进行更新和维护。
通过类目添加的方法会成为原始类 的一部分
注意:
当然也有使用Category是需要注意的问题:
1、Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现。
2、Category可以重载原始类的方法,不大不推荐这么做,这样会覆盖掉原始类的方法。如果确实要重载,那就通过继承创建子类来实现。
3、和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。
命名方式: 类名+扩展方法
如“UIAlertView+AFNetworking”。类目的接口声明与类的定义十分相似,但类目不继承父类,只需要带有一个括号,表明该类目的主要用 途。
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(@"我给您拿衣服");}@endmain文件#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类目、延展、代理协议
- 类目延展代理协议
- 类目延展代理协议
- iOS 类目,延展,协议
- iOS 类目,延展,协议
- iOS 类目,延展,协议
- iOS开发-类目、延展、协议
- iOS类目、延展和协议
- OC 基础之—(NSDate, 类目 Category,协议Protocol, 延展,委托代理)
- 协议 代理 延展 类目的总结比较
- 类目延展代理协议--复习篇
- 类目延展代理协议--复习篇
- 类目与延展、KVC、代理与协议
- IOS开发之类目,延展,协议
- ios之类目/延展/协议作用
- iOS开发之 类目,延展,协议
- 类目,延展,协议
- 雅虎WEB前端网站优化 -- 34条军规
- 家电行业也玩生态,海尔“大事件”要革谁的命?
- Your build settings specify a provisioning profile with the UUID, no provisioning profile was
- 什么是线程安全
- 利用jquery实现合并多列重复行
- iOS——延展、类目、代理协议
- Xcode因为证书问题常见的错误
- 剑指offer系列之二:字符串空格替换
- MongoDB shell插入数据
- 内存分配
- 10款流行的Markdown编辑器,总有一款适合你
- 关于在linux操作系统下打不出汉字或者在敲打汉字时无法显示拼音的问题
- android 实现类似个人中心的界面设计
- 如何获取网络IP地址