类的管理
来源:互联网 发布:macbook装windows教程 编辑:程序博客网 时间:2024/05/18 00:47
如何扩展一个类的功能?
1. 子类化
优点:可以不用关心父类的代码实现,只对我们自己新建的子类进行添加新的属性(实例变量)和方法,快速上手。
缺点:如果进行到项目尾声需要对一个类进行扩展,如果采用子类化,需要把之前工程里面所有的父类对象改成子类对象。
2. 直接修改源代码
优点:只写修改原来的类,不需要新建其他的类或其他文件,直接。
缺点:需要对当前要修改的类非常了解;如果无法获取当前类的实现部分,就没有办法进行扩展。
3. 协议
优点:既不需要对当前要扩展的类有很深的了解,又不需要创建子类。
缺点:只能添加方法,不能添加实例变量。如果无法获取当前类的实现部分,就没有办法进行扩展。
一、Category
Category:类目,分类。为没有源代码的类扩充功能。其扩充的方法可以成为原始类的一部分,可以直接用类名或者本类的对象调用,并且可以继承。该方式只能扩充方法,不能扩充实例变量。
Category的创建:
Category的使用:
1. 在类目的.h文件中声明需要添加的方法
@interface NSString (SayHi)//添加sayHi方法+ (void)sayHi;@end
2. 在类目的.m文件中实现对应的方法
@implementation NSString (SayHi)+ (void)sayHi{ //实现sayHi方法 NSLog(@"哈哈哈哈");}@end
#import <Foundation/Foundation.h>#import "NSString+SayHi.h"int main(int argc, const char * argv[]) { @autoreleasepool { //1.使用类目添加方法首先需要在对应的类中导入类目的.h文件. //2.sayHi方法是通过类目为NSString类添加的一个类方法,因此该方法的调用需要NSString类名调用. [NSString sayHi]; } return 0;}
二、Extension
Extension:延展,管理类的私有方法,实例变量,属性(如果我们不想让外界知道,或者没有必要让外界知道某些方法,实例变量,我们就可以将其写在延展里)。
延展不需要再新建一对源文件,只需要写在原始类的.m文件里即可。
在延展内部声明的方法或者实例变量外界是无法直接获取的。
@interface Person(){ NSUInteger _age;}- (void)getAge;@end@implementation Person- (void)getAge{ NSLog(@"你看看你都中老年了");}@end
Category和Extension的区别:
三、delegate设计模式
delegate的三要素:委托方,代理方,协议。
委托方:委托别人去执行某些操作的人(对象)。
协议(Protocol):委托方需要代理方执行的操作。
代理方:被委托去执行某些操作的人(对象)。
协议是一套吧标准(一堆方法的声明),只有.h文件.协议的定义以@protocol
开始,以@end
结束。比如:声明一个结婚协议。
@protocol MarryProtocol <NSObject>@required //协议中的方法默认必须实现的//做饭- (void)cook;//挣钱- (void)makeMoney;//陪玩- (void)playWithMe;@optional //可选的,可实现也可不实现@end
delegate的设计步骤:
1. 在委托方内制定协议(在委托方的.h文件中),协议中声明委托方需要让代理方执行的方法(只有方法声明)。
2. 设置delegate属性(为了防止循环引用,修饰用assign和weak)。
3. 代理方遵循协议,并实现协议中的方法。
4. 创建对应的委托方,代理方对象。
5. 设置代理人。
6. 委托方选择时机通知代理方执行对应的方法。
使用assign和weak的区别:
assign和weak都是弱引用,如果用assign声明的变量在栈中可能不会自动赋值为nil,会造成野指针错误。如果使用weak声明的变量在栈中就会自动清空,赋值为nil。
使用delegate时,非ARC时使用assign,ARC使用weak,使用assign时,需要注意释放。在dealloc里面,把delegate设成nil,以避免crash.
示例:
//1.制定协议@protocol MarryProtocol <NSObject>//做饭- (void)cook;//挣钱- (void)makeMoney;//陪玩- (void)playWithMe;@end//2.设置代理属性@interface Woman : NSObject//声明一个代理人属性,存储当前委托方的代理方是谁.id表示代理人类型,<MarryProtocol>代表要成为代理人必须遵循协议,delegate属性名.@property (nonatomic, assign) id<MarryProtocol>delegate;//时机方法- (void)hungry;- (void)wantBuySomething;- (void)boring;@end@implementation Woman//时机方法- (void)hungry{ //在调用代理让其执行方法时,进行安全处理,判断代理是否已经实现了对应的协议方法,如果已经实现,再让其执行,否则不执行. if ([self.delegate respondsToSelector:@selector(cook)]) { [self.delegate cook]; }}- (void)wantBuySomething{ [self.delegate makeMoney];}- (void)boring{ [self.delegate playWithMe];}@end//3.遵守协议并实现协议方法#import <Foundation/Foundation.h>#import "Woman.h"@interface Man : NSObject<MarryProtocol>@end@implementation Man//时机方法- (void)cook{ NSLog(@"做好吃的,让媳妇高兴");}- (void)makeMoney{ NSLog(@"去挣钱让媳妇高兴");}- (void)playWithMe{ NSLog(@"陪媳妇玩让媳妇高兴");}@end//4.创建委托方,代理方对象Woman *wife = [[Woman alloc] init];Man *husband = [[Man alloc] init];//5.设置代理人wife.delegate = husband;//6.通知代理人执行对应的方法.[wife hungry];[wife wantBuySomething];[wife boring];
只要遵循协议,都可以成为代理人,但是同一时间内,委托方的代理人只有一个。
- 类的管理
- Excel管理的一个类
- Excel管理的一个类
- 简单的加载管理类
- 类的指针成员管理
- 类的指针成员管理
- 驱动管理类的封装
- 简单的Quartz管理类
- 无线管理的帮助类
- 容器类的内存管理
- NSFileManager 类 文件的管理
- Android的activity管理类
- 一个TimerTask的管理类
- Fragment管理的工具类
- 文件管理类的命令
- android activity的管理类
- 关于Activity的管理类
- android activity的管理类的实现
- multimap 四种遍历方法
- OpenCV笔记:LUT
- Docker部署nginx并修改配置文件
- linux安转redis
- 第三章 3.4 散列表
- 类的管理
- iptables高性能前端优化-无压力配置1w+条规则
- UVA
- 第四十五篇:ReactiveCocoaObjC使用
- servlet模版 省略没必要的注释
- 代码里的命名规则:错误的和正确的对比
- 【Angular】——灵活权限下门户路由跳转
- lucene5--创建索引
- 第一节综述