iOS学习19之OC类的扩展
为一个类扩展功能:1.子类化;2.修改源代码;3.定义协议;4.Category:类目
1、Category
1> Category的作用
Category:也叫分类,类目,是为没有源代码的类扩充功能。
扩充的功能会成为原有类的一部分,可以通过原有类或者原有类的对象直接调用,并且可继承。
该方法只能扩充方法,不能扩充实例变量。
作为子类的替代手段(不需要定义子类,直接使用现有类的对象调用方法)。
一个庞大的类可以分模块开发,能够更好的对类中的方法进行更新和维护。
2> Category文件的创建
① 新建文件(command + N )
② 为Category文件的创建
③ 创建成功
3> Category的使用
① 在类目的.h文件中声明需要添加的方法
1 @interface NSString (AddMethod) //声明sayHi方法 2 3 + (void)sayHi; 4 5 @end
类名(扩展名)—— AddMethod:是扩展的类名,NSString是原有类名。
②在类目的.m文件中实现对应的方法
1 @implementation NSString (AddMethod) //实现sayHi方法 2 + (void)sayHi { 3 NSLog(@"我是字符串"); } 4 @end
③ main函数
1 #import <Foundation/Foundation.h> 2 #import "NSString+AddMethod.h" 3 int main(int argc, const char * argv[]) { 4 @autoreleasepool { 5 6 // 1.使用类目添加的方法首先需要在对应的类中导入类目的.h文件。 7 // 2.sayHi方法是通过类目为NSString类添加的一个类方法,因此该方法的调用需要NSString类名调 。 8 9 [NSString sayHi]; 10 } 11 return 0; 12 }
2、Extension
1> Extension的使用场景
为能够获得源代码的类添加私有的实例变量和方法。
注意:延展操作的类必须是能够获得源代码的类(具有.m文件的类)
2> Extension的语法格式
1 // 声明 2 @interface Teacher() 3 { 4 NSInteger _salary; //存储对应的薪资 5 } 6 - (NSInteger)getSalary; //声明一个领工资的方法 7 @end 8 9 @implementation Teacher 10 //实现领工资的操作 11 - (NSInteger)getSalary { 12 NSLog(@"这个月发了不少,可以吃大餐了"); 13 _salary = 1000; 14 return _salary; 15 } 16 @end
3> Extension的使用
main.m中调用getSalary
通过延展调用的方法属于私有方法,外界是没有访问权限的,只能在当前类的.m文件中访问
Category 和 Extension 的区别
作用不同:Category是扩展类的功能的,Extension是用来给类声明私有方法和实例变量的。
Category存放在一对.h .m文件中,Extension存放在.m文件中。
Extension可以添加实例变量,Category不可以。
3、delegate设计模式
1> delegate的三个要素
delegate设计模式的使用我们首先需要明白三个要素-委托方,代理方,协议。
委托方:委托别人去执行某些操作的人(对象)。
协议(Protocol):委托方需要代理方执行的操作。
代理方:被委托去执行某些操作的人(对象)。
2> 协议(Protocol)的定义
协议是一套标准(一堆方法的声明),只有.h文件。协议的定义以@protocol开始,以@end结束。
比如:声明一个结婚协议:
1 @protocol MarryProtocol <NSObject> 2 3 @required // 必须实现的 4 - (void)makeMoney; // 赚钱 5 6 @optional // 可选的 7 - (void)cooking; // 做饭 8 9 @end
3> delegate的设计步骤
步骤1:委托方制定一套协议(在委托方的.h文件中),协议中声明委托方需要让代理方执行的方法(只有方法声明)。
步骤2:委托方声明一个delegate属性(assign修饰),存储代理方对象。
步骤3:代理方需要遵守协议,并且对协议中的方法进行实现。
步骤4:将代理方设置为委托方的代理人(将代理方对象赋值给委托方对象的delegate属性,进行存储)
步骤5:委托方在合适的时机通知代理方对象去执行相应的操作。
4> 案例
找保姆,要求保姆完成:1.洗衣服。2.做饭。3.打扫房间。4.照看孩子。
协议HireProtocol.h文件
1 #import <Foundation/Foundation.h> 2 3 @protocol HireProtocol <NSObject> 4 5 // 1.洗衣服 6 - (void)washClothing; 7 8 // 2.做饭 9 - (void)cooking; 10 11 // 3.打扫房间 12 - (void)cleanHouse; 13 14 // 4.照看孩子 15 - (void)careForChild; 16 17 @end
Employer(雇主)类:
声明Employer.h文件
1 #import <Foundation/Foundation.h> 2 #import "HireProtocol.h" 3 4 @interface Employer : NSObject 5 6 @property (nonatomic, retain) id<HireProtocol> nanny; // 被雇佣的保姆 7 8 // 1.衣服脏了 9 - (void)clothingDirty; 10 11 // 2.饿了 12 - (void)hungry; 13 14 // 3.房子乱了 15 - (void)houseMess; 16 17 // 4.出门了 18 - (void)goOut; 19 20 @end
实现Employer.m文件
1 #import "Employer.h" 2 3 @implementation Employer 4 5 // 1.衣服脏了 6 - (void)clothingDirty 7 { 8 [self.nanny washClothing]; 9 } 10 11 // 2.饿了 12 - (void)hungry 13 { 14 [self.nanny cooking]; 15 } 16 17 // 3.房子乱了 18 - (void)houseMess 19 { 20 [self.nanny cleanHouse]; 21 } 22 23 // 4.出门了 24 - (void)goOut 25 { 26 [self.nanny careForChild]; 27 } 28 29 @end
Nanny(保姆)类:
声明Nanny.h文件
1 #import <Foundation/Foundation.h> 2 #import "HireProtocol.h" 3 4 @interface Nanny : NSObject<HireProtocol> 5 6 // 属性自己看着写... 7 8 @end
实现Nanny.m文件
1 #import "Nanny.h" 2 3 @implementation Nanny 4 5 // 1.洗衣服 6 - (void)washClothing 7 { 8 NSLog(@"洗衣服"); 9 } 10 11 // 2.做饭 12 - (void)cooking 13 { 14 NSLog(@"做饭"); 15 } 16 17 // 3.打扫房间 18 - (void)cleanHouse 19 { 20 NSLog(@"打扫房间"); 21 } 22 23 // 4.照看孩子 24 - (void)careForChild{ 25 NSLog(@"照看孩子"); 26 } 27 28 @end
主函数main.h
1 #import <Foundation/Foundation.h> 2 #import "Employer.h" 3 #import "Nanny.h" 4 5 int main(int argc, const char * argv[]) { 6 @autoreleasepool { 7 8 /* 9 找保姆,要求保姆完成:1.洗衣服。2.做饭。3.打扫房间。4.照看孩子。 10 */ 11 12 Employer *employer = [[Employer alloc] init]; 13 Nanny *nanny = [[Nanny alloc] init]; 14 15 employer.nanny = nanny; 16 17 [employer clothingDirty]; 18 19 [employer hungry]; 20 21 [employer houseMess]; 22 23 [employer goOut]; 24 25 26 } 27 return 0; 28 }