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的内省(Introspection)用法小结
- Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect实例分析
- Objective-C中NSNumber与NSDictionary的用法简介
- Objective-C中NSLog输出格式大全
- Swift调用Objective-C编写的API实例
- Swift、Objective-C、Cocoa混合编程设置指南
- Objective-c代码如何移植为Swift代码 Objective-c代码转移到Swift过程介绍
- Swift调用Objective-C代码
- 以实例讲解Objective-C中的KVO与KVC机制
- objective-c中生成随机数的方法
- 在Swift中使用Objective-C编写类、继承Objective-C类
- Swift能代替Objective-C吗?
- Objective-C 消息传递机制详解
- 在一个项目中同时使用Swift和Objective-C代码混合编程的方法
- vm安装mac os x 10.7 lion
- objective-c(一)
- objective-c(二)
- objective-c(三)
- objective-c(四)-基本数据类型以及循环和选择结构