类别(category)——通过使用类别,我们能够动态地为现有的类加入新方法。并且能够将类定义模块化地分不到多个相关文件里。通常仅仅在类别中定义方法。

类别,接口部分的定义,通常该文件命名为已有"类+类别名.h"
@interface 已有类 (类别名)
//.......方法实现
@end

比如。考虑为NSNumber添加一个类别,则接口部分代码例如以下

#import <Foundation/Foundation.h>
@interface NSNumber (code)
@end

该类别的实现部分例如以下

#import "NSNumber+code.h"

@implementation NSNumber (code)
-(NSNumber *) add:(double) num
{
return [NSNumber numberWithDouble:([self doubleValue] +num)];
}
-(NSNumber *) mult:(double) num
{
return [NSNumber numberWithDouble:([self doubleValue] +num)];
}
@end
全部NSNumber类的实例就都会具有add:、multi:方法。从而实现对NSNumber类的动态扩展。

我们知道。假设一个函数在.h文件里无声明而在.m文件里定义它的实现。那么该方法就是私有方法。仅仅能在本类的文件里使用。若我们在类别的接口部分声明这种方法。那么我们就能够实现对该私有方法的訪问。

—————————————————————————————————————————————————————————————————————————————

扩展(extension)

扩展与类别相似,扩展相当于匿名类别。即没有类别名得类别

类别,接口部分的定义,通常该文件命名为已有"类_xxx.h"
@interface 已有类 ()
//.......方法实现
@end

在使用方法上。类别通常都都有单独的.h和.m文件。扩展则是暂时的对某个类进行扩展,类的实现部分同一时候实现类接口部分定义的方法和扩展中定义的方法。定义类的扩展时,能够添加额外的实例变量,也可使用@property和@synthesizekeyword,但在定义类的列表时不同意额外定义实例变量。

有类名为Vehicle,仅仅有name属性未定义方法。

对其进行扩展

#import "vehicle.h"
@interface Vehicle ()
@property(nonatomic, strong) NSString *color;
-(void) drive:(NSString *)name;
@end

为原来的Vehicle类添加color属性和drive:方法。因此在Vehicle.m实现文件中面要实现Vehicle.h里声明的方法及这个drive:方法。

//"Vehicle.m"
#import "Vehicle_ext.h"
@implementation Vehicle
-(void) drive:(NSString *)name
{
NSLog(@"交通工具名称%@,颜色属性%@",_name,_color);
}
@end

在实际使用中,通用的做法是省略掉Vehicle_ext.h文件,而是将当中的内容直接加入在Vehicle.m文件@implementation前部就可以。

—————————————————————————————————————————————————————————————————————————————

协议(protocol)

类别(catgory)能够实现非正式协议。以NSObject为基础,为NSOject创建类别。创建类别时指定该类新增的方法,这是实现非正式协议的过程。而OC中对于实现非正式协议的类而言,OC并不强制实现该协议中的全部方法 。

正式协议使用@protocolkeyword定义

@protocol 协议名 <父协议1, 父协议2>
{
//.....方法声明
}
@end

协议是支持多继承的。在OC2.0标准中新增了@required\@optional两个keyword,声明方式是必须是必须实现还是可选的,默觉得@required.

遵守协议的语法例如以下

@interface 类名:父类型 <协议1, 协议2...>

使用协议来定义变量。那么这些变量仅仅能调用该协议中声明的方法,否则编译器会提示错误。

使用协议来定义变量的两种语法

NSObject<协议1。协议2..>*变量名;
id<协议1。协议2...> 变量。

协议体现的是一种规范,定义协议的类能够把协议定义的方法托付(delegate)给实现协议的类,这样能够让类具有更好的通用性,详细的动作交给协议的实现类来完毕。在大量的应用程序开发中大量依赖托付这个概念。


OC中类别、扩展、协议与托付的更多相关文章

  1. OC中类别、扩展、协议与委托

    一.类别(category) 类别(category)——通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法.(类别,接口部分的定义 ...

  2. 【IOS 开发】Objective - C 面向对象高级特性 - 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射

    一. Objective-C 对象简单处理 1. 包装类 (1) 包装类简介 NSValue 和 NSNumber : -- 通用包装类 NSValue : NSValue 包装单个 short, i ...

  3. oc中的分类/协议/属性

    1.分类:当我们想给某个类加一些方法时,如果不想通过继承这个类来实现,可以通过分类给这个类加一些行为,这个过程与继承相比更加轻量化. @interface NSString (SubClass) -( ...

  4. 设计模式之原型模式(深入理解OC中的NSCopying协议以及浅拷贝、深拷贝)

    原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.原型模式其实就是从一个对象再创建另一个可定制的对象,而且不需知道任何创建的细节. 比如说,有一个Person类,有firstN ...

  5. OC中协议的概念以及用法

    OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习 ...

  6. (转载)OC学习篇之---协议的概念和用法

    在前一篇文章中我们介绍了OC中类的延展,这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Jav ...

  7. OC学习篇之---协议的概念和用法

    这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字 ...

  8. OC中保存自定义类型对象的持久化方法

    OC中如果要将自定义类型的对象保存到文件中,必须进行以下三个条件: 想要把存放自定义类型的数组进行 持久化(就是将内存中的临时数据以文件<数据库等>的形式写到磁盘上)必须满足: 1. 自定 ...

  9. OC中SEL,类别,继承,协议的使用

    1.SEL SEL是selector的缩写,selector在OC中作用是定义一个方法变量,通过该方法变量来调用方法.我们在后面的UI中会经常用selector来调用事件方法.下面我将举两个例子来说明 ...

随机推荐

  1. SQL脚本小笔记

    --表添加字段.说明--- --脚本 alter table 表名 ADD 字段名 FLOAT(类型) NOT NULL Default 0(默认值) EXECUTE sp_addextendedpr ...

  2. Python如何读取指定文件夹下的所有图像

    (1)数据准备 数据集介绍: 数据集中存放的是1223幅图像,其中756个负样本(图像名称为0.1~0.756),458个正样本(图像名称为1.1~1.458),其中:"."前的标 ...

  3. 如何在DJANGO里,向有外键(一对多和多对多)的DB里插入数据?

    需要插入的数据表结构如下: class UserInfo(models.Model): user_id =models.AutoField(primary_key=True) user_name=mo ...

  4. Linux iconv使用

    iconv [选项]文件 输入/输出格式规范:-f, --from-code=名称 原始文本编码-t, --to-code=名称 输出编码 信息:-l, --list 列举所有已知的字符集 输出控制: ...

  5. 【HDOJ】2782 The Worm Turns

    DFS. /* 2782 */ #include <iostream> #include <queue> #include <cstdio> #include &l ...

  6. ECC内存

    ECC内存,即应用了能够实现错误检查和纠正技术(ECC)的内存条.一般多应用在服务器及图形工作站上,这将使整个电脑系统在工作时更趋于安全稳定.ECC是“Error Checking and Corre ...

  7. 深入浅出Node.js (附录A) - 安装Node

    A.1 Windows系统下的Node安装 A.2 Mac系统下Node的安装 A.3 Linux系统下Node的安装 A.4 总结 A.5 参考资源

  8. word中MathType公式不能 二次编辑解决方案

    问题:当新建文档然后插入公式,此时可以利用mathtype进行编辑,保存后推出第二次打开,双击公式却发现不能编辑公式. 解决方案: ////////////////////////////////// ...

  9. 使用Sql按日期条件查询

    --查询当天(1: select * from ShopOrder where datediff(day,ordTime,getdate()-1)=0 --查询当天(2:select * from i ...

  10. FBReader移植日记 第一天

    1.目标是创建两个工程,一个j2se的桌面软件,用于编辑和预览epub等格式的电子书,预览的窗口可以设置分辨率来模拟不同的设备,把编辑的结果实时的显示出来.另一个是Android的应用,用于阅读,管理 ...