OC中的类别、类扩展与协议

类别(category)

功能:
1. 类别可以给原有的类添加新功能
2. 可以在方法内部访问原有类的成员变量和方法
3. 可以添加私有方法的向前引用
4. 可以实现非正式协议
缺点:
1. 类别不能添加成员属性,添加@propoerty只能生成set、get方法
2. 方法名称不能与原有的类重复,当重复时,会覆盖原有类的方法。

//ZZPerson.h
@interface ZZPerson : NSObject
{
@private
    int _age;
}
@property (nonatomic,copy) NSString * name;
-(void) eat;
@end
//ZZPerson.m
@implementation ZZPerson
-(void) eat
{
    NSLog(@"eat");
}
@end
//ZZPerson+Drink.h
@interface ZZPerson (Drink)
- (void) drink;
@end
//ZZPerson+Drink.m
@implementation ZZPerson (Drink)
- (void) drink
{
    _age = 10;
    NSLog(@"%@,%d,%@",self.name,_age,@"drink");
    [self eat];
}
@end
//main.m
int main(int argc, const char * argv[]) {
    @autoreleasepool {

        ZZPerson *person  = [[ZZPerson alloc] init];
        person.name = @"小明";
        [person eat];
        [person  drink];
    }
    return 0;
}
//输出
//eat
//小明,10,drink
//eat

类扩展

是特殊的类别,不需要名字,一样在.m文件中为类添加私有方法和私有属性
可以将只读的权限改成可读可写的权限。

@interface Things : NSObject
@property (assign) NSInteger thing1;
@property (readonly, assign) NSInteger thing2;
-(void)resetAllValues;
@end

@interface Things()
{
NSInteger thing4;
}
@property (readwrite, assign) NSInteger thing2;
@property (assign) NSInteger thing3;
@end

Things的类扩展将thing2改为了readwrite,这样编译器就会生成setter方法了,不过只能在这个类中访问的私有方法,在公共的接口则只有getter方法。

协议

@protocol 开头
@end 结尾

@required 表示遵守这个协议的类必须实现方法(默认)
@optional 表示可选的,遵守这个协议的类可以不实现的方法

可以继承父协议

@protocol MySuperDuberProtocol <MyParentProtocol>
@end

代理协议

// 使用代理模式场景
delegate:
1、当A类对象发生什么事想通知B类型对象 (B类对象成为A类对象的代理)
2、A类中有些事情,自己无法处理,需要B类对象帮助其处理 (B类对象成为A类对象的代理)
3、B类对象向知道A类对象中发生的事情 (B类对象成为A类对象的代理)

婴儿 与 保姆

婴儿想吃的时候要通知保姆 (保姆就是婴儿的代理)
婴儿想吃了但是自己不会吃,需要保姆帮忙 (保姆就是婴儿的代理)
保姆想知道婴儿什么时候想吃了(保姆就是婴儿的代理)

//baby.h
//定一协议
@class ZZBaby;

@protocol ZZBabayDelegate <NSObject>

- (void) feedBabay:(ZZBaby *) baby;

@end
定义类
@interface ZZBaby : NSObject

@property (nonatomic,strong) id<ZZBabayDelegate> delegate;

//用于记录婴儿吃了多个克奶粉
@property (nonatomic,assign) int food;

- (void) wantToEat;

@end
//baby.m
@implementation ZZBaby

- (void) wantToEat
{
   if ([self.delegate respondsToSelector:@selector(feedBabay:)]) {
         [self.delegate feedBabay:self];
    }
}
@end
// nurse.h
@interface ZZNurse : NSObject <ZZBabayDelegate>
@end
// nurse.m
#import "CZBaby.h"
@implementation ZZNurse

//喂婴儿
- (void) feedBabay:(ZZBaby *) baby
{
    baby.food += 15;
    NSLog(@"%s,food = %d",__func__,baby.food);
}
@end
// main.m
int main(int argc, const char * argv[]) {

    ZZBaby *baby = [[ZZBaby alloc] init];
    ZZNurse * nurse = [[ZZNurse alloc] init];
    baby.delegate = nurse;
    [baby wantToEat];
    //输出 -[ZZNurse feedBabay:],food = 15
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值