---恢复内容开始---
一Category
1Category 也叫分类,类目。是为没有源代码的类扩充功能
2扩充的功能会成为原有的类的一部分,可以通过原有类或者原有类的对象直接调用,并且可以继承
3该方式只能扩充方法,不能扩充实例变量
Category的文件创建
在类目的.h文件中声明需要添加的方法
@interface NSString (AddMethod) //声明sayHi⽅方法 + (void)sayHi; @end
在类目的.m文件中实现需要实现的方法
@implementation NSString (AddMethod) //实现sayHi⽅方法 + (void)sayHi { NSLog(@"我是牛逼的字符串"); } @end
①在使用类目添加的方法首先要在对应的类中导入类目的.h文件
②sayHi方法是通过类目为NSString类添加的一个类方法,因此该方法的调用需要NSString类名调用
二Extension
1未能够获得源代码的类添加私有的实例变量和方法
2注意:延展操作的类必须是能够获得源代码的类
Teacher类中.m⽂文件中的代码 @interface Teacher() { NSInteger _salary; //存储对应的薪资
} - (NSInteger)getSalary; //声明⼀一个领⼯工资的⽅方法
@end @implementation Teacher //实现领⼯工资的操作 - (NSInteger)getSalary { NSLog(@"这个⽉月发了不少,可以吃⼤大餐了");
_salary = 1000; return _salary; } @end
main.m中调⽤用getSalary
Teacher *teacher = [[Teacher alloc]init];
[teacher getSalary];
通过延展定义的⽅方法属于私有⽅方法,外界是没有访问权
限的,只能在当前类的.m⽂文件中访问。
Category 和Extension的区别
三delegate设计模式
1delegate的三要素 委托方,代理方,协议
2委托方:委托别人去执行某些操作的人(对象)
3协议;(Protocol):委托方需要代理方执行的操作
4代理方:被委托去执行某系操作的人(对象)
delegate模式写使用案例
案例描述
结婚案例:有⼀一个⼥女孩结婚之前需要⾃自⼰己洗⾐衣服,做饭,挣
钱养活⾃己。但是有⼀一天⼥女孩不想再⾃自⼰己做饭,洗⾐衣服,挣
钱养活⾃己,因此她想要找⼀一个代理⼈人来帮她做,于是就想
到了结婚。
案例分析
对于做饭,洗⾐衣服,挣钱养活⾃自⼰己这些事情⼥女孩不
想⾃自⼰己做,想要通过结婚来找⼀一个男孩帮她做的过
程是⼀一个明显的代理设计模式。其中⼥女孩在该过程
中是委托⼈人,跟她结婚的那个男孩是代理⼈人,下⾯面
我们来看⼀一下如何通过代理设计模式实现该过程。
步骤1:⼥女孩制定协议 在⼥女孩的.h⽂文件中声明协议GirlDelegate @protocol GirlDelegate <NSObject> - (void)cooking; //做饭 - (void)makeMoney; //挣钱养活⾃自⼰己 @optional - (void)washing; //洗⾐衣服 @end
步骤2:⼥女孩定义delegate属性 在⼥女孩的.h⽂文件中声明协议GirlDelegate @interface Girl : NSObject
//声明 delegate属性存储代理⼈人对象。<>代表遵循协议
@property (nonatomic, assign)id<GirlDelegate>delegate;
@end
步骤3:男孩遵守协议并实现协议⽅方法 男孩遵守协议(男孩的.h⽂文件中) #import <Foundation/Foundation.h> #import "Girl.h" @interface Boy : NSObject<GirlDelegate> @end
步骤3:男孩遵守协议并实现协议⽅方法 男孩实现协议⽅方法(男孩的.m⽂文件中) @implementation Boy - (void)cooking { NSLog(@"给⽼老婆做饭"); } - (void)makeMoney { NSLog(@"挣钱养活⽼老婆"); } //洗⾐衣服的操作可以选择实现 - (void)washing { NSLog(@"为⽼老婆洗⾐衣服"); } @end •
步骤4:将男孩设置为⼥女孩的代理⼈人 在main.m⽂文件中完成的操作 //创建男孩对象 Boy *boy = [[Boy alloc] init]; //创建⼥女孩对象 Girl *girl = [[Girl alloc] init]; //将男孩设置为⼥女孩的代理⼈人对象 girl.delegate = boy; •
步骤5:⼥女孩在合适的时机通知男孩做相应的操作 //模拟饥饿的操作 if ([girl.delegate respondsToSelector:@selector(cooking)]) { //通知男孩去做饭 [girl.delegate cooking]; } 注:respondsToSelector:该⽅方法判断对象是否能够对某⼀一个选定的⽅方法 做出响应。
---恢复内容结束---