- 一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,主要的任务是帮你带孩子、做饭、洗衣服等。
使?场景:凡是某些任务?己不去实现,想让别人去实现的时候,就可以指定一个代理,让代理帮你去做。你只需要通知代理去做某事。
版权声明:本文为博主原创文章,未经博主允许不得转载。