一.Category
1.简介
Category也叫分类或者类目
主要作用是为没有源代码的类添加方法
通过Category添加的方法会成为原类的一部分.从而达到扩展一个类的功能.
2.定义
新建文件
选择Objective-C Category模板
填写类名和分类名
.h文件添加方法声明
.m添加方法实现
3.声明
NSString+Info.h
#import <Foundation/Foundation.h> @interface NSString (Info) - (void)info; @end
4.实现
NSString+Info.m
#import "NSString+Info.h" @implementation NSString (Info) - (void)info { NSLog(@"王宁"); } @end
5.main.m
NSString *str = [[NSString alloc] init]; [str info];
6.Category与子类的区别
Category | Subclass | |
功能 | 只能为类添加方法 | 既能添加方法又能添加变量 |
特点 | 新添加的方法会成为原始类的一部分,能被子类继承 | 新添加的方法只有子类有,父类不具有 |
使用 | 使用原始类的实例(如果是-方法)或者原始类(如果是+方法)调用方法 | 子类才能调用.如果在项目开发到尾声的时候,使用子类添加了方法,需要对已经写掉吗做类型替换(将父类替换成子类) |
二.Extension
1.简介
Extension的主要作用是管理类的"私有"方法
面向对象编程也叫面向接口编程
设计类的时候有些方法对外公开,有些只对内使用. Extension的功能是帮我们去管理这些内部使用的方法
2.定义
以计算三个数和为例
Cacl.h文件
#import <Foundation/Foundation.h> @interface Cacl : NSObject - (NSInteger)MaxOfThree:(NSInteger)num1 num2:(NSInteger)num2 num3:(NSInteger)num3; - (NSInteger)MaxOfThree:(NSInteger)num1 num2:(NSInteger)num2; @end
Cacl.m
#import "Cacl.h" //管理类的私有方法 @interface Cacl () @property (nonatomic, assign) NSInteger num; - (NSInteger)MaxOfTwo:(NSInteger)num1 num2:(NSInteger)num2; - (NSInteger)MaxOfTwo:(NSInteger)num1; @end @implementation Cacl - (NSInteger)MaxOfTwo:(NSInteger)num1 { return self.num > num1 ? self.num : num1; } - (NSInteger)MaxOfThree:(NSInteger)num1 num2:(NSInteger)num2 { [self MaxOfTwo:num1]; return [self MaxOfTwo:num2]; } @end
main.m
Cacl *cal = [[Cacl alloc] init]; NSInteger a = [cal MaxOfThree:2 num2:5 num3:1]; NSLog(@"%ld", a);
3.Category和Extension的区别
Category | Extension | |
作用 | 为没有源代码的类添加方法 | 管理类的私有方法 |
格式 | 定义一对.h和.m | 把代码写到原始类的.m文件中 |
三. Protocol
1.简介
Protocol(协议)是一套标准, 只有.h文件.
接受协议的对象实现协议中定义的方法.
2.定义
System.h
#import <Foundation/Foundation.h> @protocol KeyboardDelegate <NSObject> //必须实现的方法 @required //选择实现的方法 @optional - (void) returnKeyHandle; @end @interface System : NSObject @property (nonatomic, assign) id <KeyboardDelegate> delegate; - (void) returnTrigger; @end
System.m
#import "System.h" @implementation System - (void)returnTrigger { [self.delegate returnKeyHandle]; } @end
3.遵守协议
Developer.h
#import <Foundation/Foundation.h> #import "System.h" @interface Developer : NSObject <KeyboardDelegate> - (void) returnKeyHandle; @end
Developer.m
#import "Developer.h" @implementation Developer //实现符合协议的方法 - (void) returnKeyHandle { NSLog(@"河俊 寡廉鲜耻也"); } @end
五.delegate设计模式
1.简介
protocol的核心使用场景是实现delegate设计模式
2.mian.m
System *sys = [[System alloc] init]; Developer *dev = [[Developer alloc] init]; sys.delegate = dev; [sys returnTrigger];