一、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. Metasploit的攻击实例讲解----辅助扫描工具

    不多说,直接上干货! 怎么弹出来这个呢,连续按两次tab. msf > use auxiliary/scanner/ Display all possibilities? (y or n) us ...

  2. SharePoint 2010 开发人员学习指南

    kaneboy 翻译,一切内容版权归 Microsoft.1. SharePoint 开发起步教程 这是一个为准备进入到 SharePoint 开发领域的 .NET 开发人员所准备的免费在线学习课程. ...

  3. PostgreSQL Replication之第八章 与pgbouncer一起工作(1)

    当您在使用大规模的设施工作,可能有时候,您必须处理许多并发打开的连接.没有人会使用十台服务器来为两个并发用户提供服务--在许多情况下,这根本没有意义.大量的设施通常会处理成百上千的并发连接.引入连接池 ...

  4. softwares我的软件列表(转载)

    [TOC] 个人在archlinux下的日常使用经验列出,故而在archlinux及其衍生发行版中,以下所列软件几乎可以从archlinux官方源或者aur中搜索下载安装,所列出名字一般即是其包名,使 ...

  5. ArchLinux 调节屏幕亮度和音量大小

    我使用的是dwm,所以这种琐碎小事还要我们亲自动手, 以后考虑做个脚本,把声音调节.屏幕亮度什么的统统塞进去 屏幕亮度 # 查看亮度最大值 cat /sys/class/backlight/intel ...

  6. 一个HelloWorld版的MySQL数据库管理器的设计与实现(源码)

    2011年,实习期间写了一个简单的数据库管理器. 今天,特意整理了下,分享给大家. 有兴趣的同学,可以下载源码,瞧瞧. 源码只有4个类:LoginGUI,DatabaseGUI,Record,MySQ ...

  7. CSU 1374 Restore Calculation 数位DP

    题意: 给你三个数A, B, C(没有前导0),但是其中某些位不知道. 问A+B=C成立有多少种情况. 思路: 从最后一位往前推,枚举A, B的每一种情况,考虑进位和不进位两种情况. 代码: #inc ...

  8. POJ——T 1988 Cube Stacking

    http://poj.org/problem?id=1988 Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 25865   ...

  9. Hadoop RPC框架

    1.RPC框架概述 1.1 RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不须要了解底层网络技术的协议. R ...

  10. 受不了Android SDK文档打开缓慢问题,自己开发简易脱机浏览器。

    google android sdk离线文档打开的时候特别慢,据说是要从谷歌官网拉取一些东西导致的.脱机浏览能够解决该问题.PC端能够使用firefox. 可是Android端貌似没有支持脱机工作的浏 ...