首页 > 代码库 > Objective-C_类的扩展
Objective-C_类的扩展
- 一Category的定义和使用
- 二Extension的定义和使用
- 三Protocol的定义和使用
- delegate的使用
一、Category的定义和使用
Category,分类或类目。主要作用是为没有源码的类加入方法。通过Category加入的方法会成为原类的一部分。
从而达到扩展一个类的功能。
定义Category过程
- 新建?件
- 选择Objective-C Category模板
- 填写类名和分类名
- .h?件加入?法声明
- .m加入?法实现
Category的声明
NSString+SayHi.h文件
@interface NSString (SayHi)
- (void)hi;
@end
Category的实现
NSString+SayHi.m文件
#import “NSString+SayHi.h”
@implementation NSString(SayHi)
- (void)hi
{
NSLog(@”这是通过category为NSString加入的hi?方法”)。
}
@end
Category与?类的差别
Category(类目) | Subclass(子类) | |
---|---|---|
功能 | 仅仅能为类加入方法 | 既能为类加入方法。也能加入变量 |
特点 | 新加入的方法会变成原始类的一部分,能被子类继承 | 新加入的方法仅仅有子类才有。父类没有 |
使用 | 使用原始类的实例(-号方法)或者使用原始类(+号方法)调用方法 | 子类才干调用, |
二、Extension的定义和使用
Extension,延展。主要作用是管理类的“私有”方法。面向对象编程在设计一个类的时候,有些方法须要对外公开(我们称为接口)。有些方法仅仅内部使用。
Extension的功能是帮我们去管理这些内部使用的方法(“私有”方法)。
定义Extension过程
Extension的语法格式和Category非常类似,相当于把Category的.h文件放到了原始类的.m文件里。Extension针对的是本类。必须有源码的类。
xxx.m文件
@interface xxx (ExtensionName)
//你的方法列表
@end
@implementation xxx
//方法的实现
@end
Category和Extension的差别
Category | Extension | |
---|---|---|
作用 | 为没有源码的类加入方法 | 管理类的私有方法 |
格式 | 定义一对.h和.m | 把代码写到原始类的.m文件里 |
三、Protocol的定义和使用
Protocol。协议。是iOS开发中经常使用的技术。协议是一套标准(一堆方法的声明),仅仅有.h文件。
就像一张任务清单,上?写了一堆须要处理的事。清单交给谁,谁就要去完毕清单上规定的任务。接受协议的对象实现协议中定义的方法。
即:清单交给谁。谁就要去完毕清单上规定的任务。
协议分两种: 正式协议和非正式协议。
协议中的方法默认是必须实现的,即@required。
关键字@optional修饰的?法是可选的,可实现也能够不实现。
协议和代理6个步骤
- 声明协议
- 设置代理人属性
- 让代理人调用方法(通知代理人运行方法)
- 签订协议
- 指定代理人
- 实现协议方法
以结婚为样例(女方和男方)
- 声明协议 (女方)
- 设置代理人属性 (女方)
- 让代理人调用方法(通知代理人运行方法) (女方)
- 签订协议 (男方)
- 指定代理人 (女方)
- 实现协议方法 (男方)
结婚演示样例的代码实现:
Girl.h文件代码例如以下:
#import <Foundation/Foundation.h>
#pragma mark 协议第一步
/* 声明协议 */
@protocol Marry <NSObject>
/* 方法分两种 */
@required /* 必需的 */
- (void)makeMoney;
@optional /* 可选的 */
- (void)washCloth;
- (void)cook;
@end
@interface Girl : NSObject
#pragma mark 协议第二步
/* 设置代理人属性, 注意:assign */
@property (nonatomic, assign) id<Marry> delegate;
@property (nonatomic, retain) NSString *name;
@property (nonatomic, assign) NSInteger age;
#pragma mark 协议第三步
/* 通知代理人调用方法 */
- (void)marry;
@end
Girl.m文件代码例如以下:
#import "Girl.h"
@implementation Girl
#pragma mark 协议第三步
/* 通知代理人调用方法 */
- (void)marry
{
NSLog(@"我和%@结婚了, %@负责挣钱了.", self.delegate, self.delegate);
[self.delegate makeMoney];
}
@end
Boy.h文件代码例如以下:
#import <Foundation/Foundation.h>
#import "Girl.h" /* 仅仅能是import */
#pragma mark 协议第四步
/* 签订协议 */
@interface Boy : NSObject<Marry>
@property (nonatomic, retain) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end
Boy.m文件代码例如以下:
#import "Boy.h"
@implementation Boy
#pragma mark 协议第六步
/* 实现协议方法 */
- (void)makeMoney
{
NSLog(@"我是%@, 我负责挣钱.", self.name);
}
@end
main.m文件代码例如以下:
#import <Foundation/Foundation.h>
#import "Girl.h"
#import "Boy.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
/* 创建Girl 和 Boy对象 */
Girl *girl = [[Girl alloc] init];
girl.name = @"LiSi";
girl.age = 22;
Boy *boy = [[Boy alloc] init];
boy.name = @"WangLaowu";
boy.age = 25;
#pragma mark 协议第五步
/* 指定代理人 */
girl.delegate = boy;
[girl marry];
}
return 0;
}
delegate的使用
Protocol的核?使用场景是实现delegate设计模式。delegate(代理)。通俗的讲就是代理商。基本的任务是帮你完
成一些任务。比方:保姆就能够觉得是delegate,基本的任务是帮你带孩子、做饭、洗衣服等。
使?场景:凡是某些任务?己不去实现,想让别人去实现的时候。就能够指定一个代理。让代理帮你去做。
你仅仅须要通知代理去做某事。
Objective-C_类的扩展