一、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,基本的任务是帮你带孩子、做饭、洗衣服等。

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

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


Objective-C_类的扩展的更多相关文章

  1. OC基础:类的扩展.协议 分类: ios学习 OC 2015-06-22 19:22 34人阅读 评论(0) 收藏

    //再设计一个类的时候,有些方法需要对外公开(接口),有些仅供内部使用. 类的扩展:为类添加新的特征(属性)或者方法 对已知类: 1.直接添加 2.继承(在其子类中添加实例变量和方法) 3.使用ext ...

  2. C++类功能扩展预留五招

    第一招虚函数 通过派生类来进行功能扩展是基本的面向对象的方式,这种方式大如下: class base { public: virtual ~base(){} virtual void fun() { ...

  3. IOS基础之 (十二) 类的扩展

    对OC类的扩展总结如下,共有4个: 1.子类 subClass 作用:可以使用类的继承来增添父类的变量和方法. 写法:在.h文件中 @interface Student : Person 2.分类 C ...

  4. 类的扩展--类目和延展--ios

    person+money.h  这是类目类 #import "Person.h" //这是扩展person类的接口类,独立一个文件 @interface Person (Money ...

  5. ASP.Net string 类的扩展方法 [转]

    string 类的扩展方法列表(基本相同于 IEnumerable<T> 接口的成员列表): Aggregate<>     //累加 All<>        / ...

  6. 常用上网增强类Chrome扩展(转)

    Chrome是个非常好用的浏览器,拥有丰富的扩展资源库,能够满足网民各种各样的需求,对于网民来说,通过Chrome扩展来增强上网体验是一个基本需求,但是安装过多的扩展有容易耗费大量系统资源,今天月光博 ...

  7. Unity中对系统类进行扩展的方法

    Unity扩展系统类,整合简化代码 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...

  8. 错误 在类中找不到main方法请将main方法定义为 public static void main String args否则JavaFX应用程序类必须扩展javafx-ap

    最近在使用eclipse编写java程序时遇到这样一个问题: 错误在类中找不到main方法,请将main方法定义为 public static void main(String[] args)否则 J ...

  9. 错误: 在类中找不到 main 方法, 请将 main 方法定义为:public static void main(String[] args)否则 JavaFX 应用程序类必须扩展javafx.ap

    最近在使用eclipse编写java程序时遇到这样一个问题: 错误在类中找不到main方法,请将main方法定义为 public static void main(String[] args)否则 J ...

  10. 找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.应用程序类必 须扩展javafx.application.Application”

    用eclipse写代码的时候,写了一个简单的程序,编译的时候突然出现“错误: 在类 com.test.demo 中找不到 main 方法, 请将 main 方法定义为: public static v ...

随机推荐

  1. django 笔记8 url模板 自定义函数 simple_tag

    感谢alex老师~ 知识点: URL - 两个没见 url>路由系统> 函数或类 > 返回字符串 Form表单提交: 提交 >url>函数或类中的方法 -.. HttpR ...

  2. jzoj1495 宝石 解题报告[扫描线]

    Description 见上帝动了恻隐之心,天后也想显示一下慈悲之怀,随即从口袋中取出一块魔术方巾,让身边的美神维纳斯拿到后堂的屏风上去试试,屏风是正方形的,高和宽方向上各划有m条鱼屏风的边平行的直线 ...

  3. WebApp之H5登录注册

    代码indexhtml <!DOCTYPE html> <html> <head> <meta charset="utf-8"> & ...

  4. redhat赋予普通用户root权限

    方法一:修改 /etc/sudoers 文件,找到下面一行,把前面的注释(#)去掉 ## Allows people in group wheel to run all commands%wheel  ...

  5. NodeJS学习笔记 进阶 (4)基于express+muter的文件上传(ok)

    个人总结:这篇文章主要讲了multer插件的使用,类似于formidable,可以用来处理post表单中的文件上传,读完这篇文章需要10分钟. 摘选自网络 概览 图片上传是web开发中经常用到的功能, ...

  6. 修改route.php文件对ThinkPHP快速注册路由

    THINKPHP快速注册路由方式可以用 return[ "test"=>"index/index/demo", 'getid/:id'=>'inde ...

  7. bzoj1612 Usaco08 Jan 牛大赛

    水题模拟 建一个图,每两个牛进行比赛就连一条边,然后两遍dfs求出比他弱和比他强的牛,最后如果相加数量等于n,说明他能与全部的牛进行比较,排名确定. #include<bits/stdc++.h ...

  8. AWK行处理的用法实例

    第一节 awk的工作流程及基础用法 awk操作符会先检索文件的行信息,然后在行信息里找需要的内容. Awk的默认分割付是空格,awk '/模式/{print $1,$2}' file ##模式的位置可 ...

  9. iostat---监视磁盘CPU相关信息

    iostat命令被用于监视系统输入输出设备和CPU的使用情况.它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况.同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分 ...

  10. 【习题 8-20 UVA-1620】Lazy Susan

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 会发现,如果把连续4个数字进行一次翻转的话. 假设这连续的4个数字的逆序数为x; 那么翻转过后,逆序数就会变成6-x; (最多6个逆 ...