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 ...
随机推荐
- Asp.Net中使用水晶报表(中)
Asp.Net中使用水晶报表(中) 使用Pull模式 我们将通过下面的这些步骤来通过Pull模式来执行水晶报表 1.首先创建rpt文件,并使用水晶报表设计接口设置一些必须的数据连接. 2.拖放一个 C ...
- Bayes++ Library入门学习之熟悉class-Bayesian_filter_base(2)
前面我们已经熟悉了Bayesian_filter::Bayes_filter_base和其子类的击继承关系,接下来我们开始学习该类的实现. bayesFlt.hpp文件为其实现主体,首先是两个常规的头 ...
- Bayes++ Library入门学习之熟悉class-Bayesian_filter_base(1)
在对Bayes++库的名称空间有了一个大概的了解之后,我们开始学习该名称空间下的第一个子类Bayesian_filter::Bayes_filter_base. 该类与其子类的继承关系图如下图所示. ...
- C++笔试专题一:运算符重载
一:下面重载乘法运算符的函数原型声明中正确的是:(网易2016校招) A:MyClass operator *(double ,MyClass); B:MyClass operator *(MyCla ...
- LightOJ-1282 Leading and Trailing 模算数 快速幂 对数的用法
题目链接:https://cn.vjudge.net/problem/LightOJ-1282 题意 给出两个正整数n(2 ≤ n < 231), k(1 ≤ k ≤ 1e7) 计算n^k的前三 ...
- [Poi] Setup PostCSS and Tailwind with Poi
This lesson walks through setting up a Poi project using PostCSS and the popular Tailwind library fo ...
- Windows安装两个mysql数据库步骤
因为新旧项目数据库版本号差距太大.编码格式不同.引擎也不同,所以仅仅好装两个数据库. 本次安装两个mysql数据库.版本号各自是4.0.18,5.5.36.都是可运行文件直接安装. 本机上之前已经安装 ...
- Effective JavaScript Item 40 避免继承标准类型
本系列作为Effective JavaScript的读书笔记. ECMAScript标准库不大.可是提供了一些重要的类型如Array,Function和Date.在一些场合下.你或许会考虑继承当中的某 ...
- Android页面事件挂接模拟
Java没有C#的引用类型.因此事件的挂接一般都是利用接口来实现,有两种方式: 1)定义一个实现事件接口的类,然后实现接口方法,然后通过将这个类的实例加入到事件监听器里面: public class ...
- 使用LruCache和DiskLruCache来下载图片
LruCache是一个非常好用的图片缓存工具: 主要做法是:滑动图片时将图片的bitmap缓存在LruCache<String, Bitmap>中,退出程序后将图片缓存进文件中.採用Dis ...