Objective-C_类的扩展
一、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,基本的任务是帮你带孩子、做饭、洗衣服等。
使⽤场景:凡是某些任务⾃己不去实现,想让别人去实现的时候。就能够指定一个代理。让代理帮你去做。
你仅仅须要通知代理去做某事。
Objective-C_类的扩展的更多相关文章
- OC基础:类的扩展.协议 分类: ios学习 OC 2015-06-22 19:22 34人阅读 评论(0) 收藏
//再设计一个类的时候,有些方法需要对外公开(接口),有些仅供内部使用. 类的扩展:为类添加新的特征(属性)或者方法 对已知类: 1.直接添加 2.继承(在其子类中添加实例变量和方法) 3.使用ext ...
- C++类功能扩展预留五招
第一招虚函数 通过派生类来进行功能扩展是基本的面向对象的方式,这种方式大如下: class base { public: virtual ~base(){} virtual void fun() { ...
- IOS基础之 (十二) 类的扩展
对OC类的扩展总结如下,共有4个: 1.子类 subClass 作用:可以使用类的继承来增添父类的变量和方法. 写法:在.h文件中 @interface Student : Person 2.分类 C ...
- 类的扩展--类目和延展--ios
person+money.h 这是类目类 #import "Person.h" //这是扩展person类的接口类,独立一个文件 @interface Person (Money ...
- ASP.Net string 类的扩展方法 [转]
string 类的扩展方法列表(基本相同于 IEnumerable<T> 接口的成员列表): Aggregate<> //累加 All<> / ...
- 常用上网增强类Chrome扩展(转)
Chrome是个非常好用的浏览器,拥有丰富的扩展资源库,能够满足网民各种各样的需求,对于网民来说,通过Chrome扩展来增强上网体验是一个基本需求,但是安装过多的扩展有容易耗费大量系统资源,今天月光博 ...
- Unity中对系统类进行扩展的方法
Unity扩展系统类,整合简化代码 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...
- 错误 在类中找不到main方法请将main方法定义为 public static void main String args否则JavaFX应用程序类必须扩展javafx-ap
最近在使用eclipse编写java程序时遇到这样一个问题: 错误在类中找不到main方法,请将main方法定义为 public static void main(String[] args)否则 J ...
- 错误: 在类中找不到 main 方法, 请将 main 方法定义为:public static void main(String[] args)否则 JavaFX 应用程序类必须扩展javafx.ap
最近在使用eclipse编写java程序时遇到这样一个问题: 错误在类中找不到main方法,请将main方法定义为 public static void main(String[] args)否则 J ...
- 找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.应用程序类必 须扩展javafx.application.Application”
用eclipse写代码的时候,写了一个简单的程序,编译的时候突然出现“错误: 在类 com.test.demo 中找不到 main 方法, 请将 main 方法定义为: public static v ...
随机推荐
- 木马——本质就是cs socket远程控制,反弹木马是作为c端向外发起网络请求
摘自:http://kczxsp.hnu.edu.cn/upload/20150504165623705.pdf 里面对于木马的实验过程写得非常清楚,值得一看. 木马是隐藏在正常程序中的具有特殊功 ...
- Android textView开头空两格问题,排版缩进2个汉字
一般为了排版,textView中字符段落开头一般都会空两格显示,如下图 但是如果你靠敲击空格来解决那就错了,那样在不同的屏幕上显示会差异,完美的解决方法是用转义字符”\t“,在段首加\t\t就解决.加 ...
- C#派生类中使用基类protected成员的方法
我们知道C#中通过继承可以使一个具有公共数据和方法的基类被广泛应用从而减少代码量,这样派生类会具有基类中所有成员(除构造器等),我们理所当然可以通过派生类实例来使用基类的成员.那么当基类成员被prot ...
- caffe(6) Blob,Layer,Net 以及对应配置文件的编写
深度网络(net)是一个组合模型,它由许多相互连接的层(layers)组合而成.Caffe就是组建深度网络的这样一种工具,它按照一定的策略,一层一层的搭建出自己的模型.它将所有的信息数据定义为blob ...
- POJ2104 K-th Number(线段树,二分,vector)
题意 不带修改区间第k小.(n<=100000) 题解 建立线段数和vector数组(vector为当前区间排列之后的序列)(归并) 然后对于每一个询问二分答案. 问题就转化为区间有多少数小于等 ...
- Python学习七步走
在周五的下午三点钟(为什么是这个时间?因为事情总会在周五下午三点钟发生),你收到一条通知,客户发现你的软件出现一个错误.在有了初步的怀疑后,你联系运维,查看你的软件日志以了解发生了什么,因为你记得收到 ...
- Unity 给FindGameObjectsWithTag排序
GameObject[] patrol = GameObject.FindGameObjectsWithTag ("Player").OrderBy (g => g.tran ...
- java钩子函数
也不知道我理解的对不对,欢迎大家讨论! 自己写了个钩子函数,我理解的钩子函数: public interface Transactioner { String wedontknow() ; } pub ...
- Nrf51822中设置128bit UUID service
Nrf51822中设置128bit UUID service uint32_tble_dajia_add_service(ble_dajia_t *p_wechat) { uint32_t err_c ...
- HDU 3555 Bomb(数位DP模板啊两种形式)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 Problem Description The counter-terrorists found ...