您的位置:首页 > 移动开发 > Objective-C

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

2015-10-31 20:17 417 查看

类别(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  objective-c