OC 08 类目延展协议

类目的特点:

    若类目中重写了类现有的方法,则优先调用类目方法

    类目无法添加成员变量,而可以添加属性

    类目中添加属性需要使用@dynamic动态合成,手动实现setter和getter方 法,并且改类已经存在对应的成员变量

 

为什么我们要使用类目?

   某些情况下,我们需要对一些现有的类添加一些方法

   通常做法是继承要添加方法的类,然后在子类中扩展出新的方法

   Objective-C的动态语言机制,可以为现有的类添加新的方法

 

 类目实例

现在我们要对NSString增加新的方法用于比较两个字符串的大小,告诉用户谁大。

 

第一步:创建类目

 

 

 

第二步:在.h中创建一个方法,该方法就是类目给NSString增加的方法,用于比较两字字符串大小

NSString + Compare.h

   - (NSComparisonResult)compareValue:(NSString*)string;

 

NSString + Compare.m

#import"NSString+Compare.h"

@implementationNSString (Compare)

-(NSComparisonResult)compareValue:(NSString *)string{

    if (self.length == 0 &&string.length == 0) {

        NSLog(@"不合法");

        return -3;

    }

    NSInteger a = [self integerValue];

    NSInteger b = [string integerValue];

    if (a > b) {

        NSLog(@"first > second");

        return -1;

    }else if (a < b){

        NSLog(@"first < second");

        return 1;

    }

    NSLog(@"first = second");

    return 0;

 

}

main.m

  NString *string = @"123";

  NSString *string2 = @"234";

 

  NSInteger value = [stringcompareValue:string2];

  NSLog(@"%ld",value);

 

上面说过类目可以添加属性,我们来看看实例

我们创建一个person类,给这个类添加类目

Person+AgeDifference.h

#import"Person.h"

@interfacePerson (AgeDifference)

//为person添加身份证号code属性

//类目中属性仅仅完成了声明部分

@property(nonatomic, retain) NSString *code;

-(NSInteger)ageDifferenceWithPerson:(Person *)person;

@end

 

Person+AgeDifference.m

#import"Person+AgeDifference.h"

@implementationPerson (AgeDifference)

//@dynamic属性动态合成:需要手动实现setter和getter方法,并且与属性声明部分一致

@dynamiccode;

-(void)setCode:(NSString *)code{

    if (_code != code) {

        [_code release];

        _code = [code retain];

    }

 

}

-(NSString *)code{

    return _code;

 

}

-(NSInteger)ageDifferenceWithPerson:(Person *)person{

    if (!person) {

        return 0;

    }

    return labs(self.age - person.age);

}

@end

main.m

       Person *person = [[Person alloc] init];

       Person *person1 = [[Person alloc] init];

       person1.code = @"2345678";

       NSInteger age = [personageDifferenceWithPerson:person1];

       NSLog(@"age difference is %ld",age);

NSLog(@"ffff:%@",person1.code);

 

延展

类的私有方法

   Objective-C中没有绝对意义上的私有方法 在.h文件中声明的方法都属于公开的方法,意味着开放给别人调用

   如果不想公开某些方法,可以不在.h文件中声明 这样的方法可以被本类中的其他方法所调用

   如果在类外面强行调用这些未公开的方法,也能调用,但是会有编译器警告

 

延展的概念

   延展是匿名类目,为当前类添加私有方法: 使用类目增加的方法是让外部可见,而延展的目的是增加方法,让外部不可见;

  不可见的目的更多的是封装代码,对于想要隐藏的算法和接口,可以使用延展;

 

注意:

//延展为类声明私有方法,外部不可见,只有本类可以使用

//延展可以声明方法,成员变量,属性

 

@interfacePerson ()

@end

这种方式使用延展,@implementation部分可直接添加到Person类的实现中;注意如果是给其他文件中的类延展则不能省略这些。

 

延展的实例

在刚刚创建的Person类的.m文件直接写延展

 

Person.m

#import"Person.h"

//延展

@interfacePerson ()

 

//为类声明私有方法,外部不可见,只有本类可以使用

//可以声明方法,成员变量,属性

-(NSInteger)changeNumber:(NSNumber *)stringValue;

@end

 

@implementationPerson

-(instancetype)initWithName:(NSString *)name age:(NSInteger)age{

    self = [super init];

    if (self) {

        _name = name;

        _age = age;

      NSInteger a =  [self changeNumber:@"-1"];

        NSLog(@"gggg:%ld",a);

    }

    return self;

}

-(NSInteger)changeNumber:(NSNumber *)stringValue{

    return labs([stringValue integerValue]);

}

@end

 

可以发现在延展里面的方法,只能在本类中调用,不可以在其他地方调用

 

协议,委托模式

  协议

  协议是一个命名的方法列表,是对象之间的交互原则与共识,一个类使用协议称作该类遵守了协议;

  协议中的所有内容,只是作为一个声明,由遵守该协议的类的实现部分去实现协议方法(和我们生活中一样,如果没有人履行它,协议就是无用的纸而已);

   协议可以声明属性和方法,协议的目的是告诉外部我一定会有,所以它无法用来声明全局变量,而实际上,你声明的属性和方法具体是否存在,得看你是否正确的履行了协议中的所有内容

   协议声明的属性和方法可以选择是否必须,关键字分别为@required必须和@optional可选,默认为必须;

  苹果同样提供了专门的协议文件模版,它只有一个.h文件。

 

委托模式

  Delegate本身是一种设计模式。

原理:自己不做的事,找一个委托人(delegate)来帮你做

 

注意:协议protocol 和委托delegate 是两个完全不同的概念 放在一起说是因为我们总是在同一个头文件里看到它们;

 

实例:顾客委托商家买一个iphone6

我们创建商家和顾客两个类,分别为Customer和Business

创建代理委托,我们分为三步骤

第一步:协议

第二步:代理属性

第二步:设置代理人

 

Customer.h

#import<Foundation/Foundation.h>

//协议:通常是方法列表,有两个关键字@required(方法必须实现),@optional(方法可以实现也可不实现),如果两个关键字都不加,默认required

@protocolMyDelegate <NSObject>

-(void)buyIphone:(NSString*)iphoneType;  //代理传值方法

@end

 

@interfaceCustomer : NSObject

//delegate属性:一般需使用弱引用(assign或weak)

@property(nonatomic, assign)id <MyDelegate> delegate;

-(void)willBuy;

@end

 

Customer.m

#import"Customer.h"

@implementationCustomer

-(void)willBuy{

    if (_delegate && [_delegaterespondsToSelector:@selector(buyIphone:)]) {//如果协议响应了buyIphone:方法

         [self.delegatebuyIphone:@"iphone6"];//通知执行协议方法

    }else{

        NSLog(@"_delegate不存在");

        return;

    }

}

@end

 

Business.h

#import<Foundation/Foundation.h>

#import"Customer.h"

@interfaceBusiness : NSObject<MyDelegate>

//要成为代理人必须遵守协议,并且实现协议的方法

@end

 

 

Business.m

#import"Business.h"

@implementationBusiness

//实现协议的方法

-(void)buyIphone:(NSString*)iphoneType{

    NSLog(@"有你需要的%@",iphoneType);

}

@end

 

main.m

   //委托协议

   Customer *custom = [[Customer alloc] init];

   Business *business = [[Business alloc]init];

   custom.delegate = business;//设置代理人

   [custom willBuy];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值