Objective-C_类的扩展

一、Category的定义和使用

Category,分类或类目。主要作用是为没有源代码的类添加方法。通过Category添加的方法会成为原类的一部分。从而达到扩展一个类的功能。

定义Category过程

  1. 新建⽂件
  2. 选择Objective-C Category模板
  3. 填写类名和分类名
  4. .h⽂件添加⽅法声明
  5. .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的区别

CategoryExtension
作用为没有源代码的类添加方法管理类的私有方法
格式定义一对.h和.m把代码写到原始类的.m文件中

三、Protocol的定义和使用

Protocol,协议,是iOS开发中常用的技术。协议是一套标准(一堆方法的声明),只有.h文件。就像一张任务清单,上⾯写了一堆需要处理的事。清单交给谁,谁就要去完成清单上规定的任务。接受协议的对象实现协议中定义的方法。即:清单交给谁,谁就要去完成清单上规定的任务。

协议分两种: 正式协议和非正式协议。

协议中的方法默认是必须实现的,即@required。关键字@optional修饰的⽅法是可选的,可实现也可以不实现。

协议和代理6个步骤

  1. 声明协议
  2. 设置代理人属性
  3. 让代理人调用方法(通知代理人执行方法)
  4. 签订协议
  5. 指定代理人
  6. 实现协议方法

以结婚为例子(女方和男方)

  1. 声明协议 (女方)
  2. 设置代理人属性 (女方)
  3. 让代理人调用方法(通知代理人执行方法) (女方)
  4. 签订协议 (男方)
  5. 指定代理人 (女方)
  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,主要的任务是帮你带孩子、做饭、洗衣服等。

使⽤场景:凡是某些任务⾃己不去实现,想让别人去实现的时候,就可以指定一个代理,让代理帮你去做。你只需要通知代理去做某事。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值