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 }

 

posted @ 2016-04-01 09:16  墨隐于非  阅读(311)  评论(0编辑  收藏  举报