类别(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;
}