类的管理

来源:互联网 发布: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的区别:

区别 Category Extension 作用 为没有源代码的类添加方法 管理类私有方法 格式 定义一对.h和.m 把代码写到原始类的.m中

三、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];

  只要遵循协议,都可以成为代理人,但是同一时间内,委托方的代理人只有一个。

原创粉丝点击