首页 > 代码库 > Objective-C_类的扩展

Objective-C_类的扩展

  • 一Category的定义和使用
  • 二Extension的定义和使用
  • 三Protocol的定义和使用
    • delegate的使用

一、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的差别

Category Extension
作用 为没有源码的类加入方法 管理类的私有方法
格式 定义一对.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,基本的任务是帮你带孩子、做饭、洗衣服等。

使?场景:凡是某些任务?己不去实现,想让别人去实现的时候。就能够指定一个代理。让代理帮你去做。

你仅仅须要通知代理去做某事。


<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

Objective-C_类的扩展