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

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

  2. OC中的非正式协议与正式协议的区别

    声明:以下内容转自:http://blog.csdn.net/wzzvictory/article/details/9295317# 这两个概念困扰我很久了,一直都很像搞清楚到非正式协议和正式协议有什 ...

  3. OC中类别(Catagory)基本使用

    Catagory说明 在Objective-C中如果想给一个类添加一个方法,而不用修改原有的类中代码,其他编程语言基本使用继承实现,然而苹果粑粑给我们专门提供一个一种方法就是使用类别.需要注意的是如果 ...

  4. OC中常见面试题汇整篇

    当页面跳转的时候,如何实现导航条和页面同时出现?因为他两个经常出现不同步的现象? 如何将tablview强制转换成UIScrollow? 当一个界面在6s上正好可以完全呈现,那在4s上面你是如何处理的 ...

  5. OC中Runtime浅析

    近期了解了一下OC的Runtime,真的是OC中非常强大的一个机制,看起来比較底层,但事实上能够有非常多活用的方式. 什么是Runtime 我们尽管是用Objective-C写的代码,事实上在运行过程 ...

  6. OC中常用的英文发音和注解

    OC中常用的英文 A atomic [əˈtɑːmɪk] 原子性,就是防止在未完成的时候被另外一个线程读取,造成数据错误 B barrier /ˈbæriər/ GCD异步栅栏函数:dispatch_ ...

  7. OC 中的关键词 大全(1)

    1. @interface和@implementation 分别在.h和.m文件开头处 @interface和@implementation都可以说是接口 oc中的类必须包括两部分,interface ...

  8. 5 OC 中的三种对象

    目录 OC 中对象的分类 一  instance 对象 二 类对象 三  元类对象 总结: OC 中对象的分类 instance 对象 类对象 元类对象 一  instance 对象 内存中包含哪些信 ...

  9. iOS开发几年了,你清楚OC中的这些东西么!!!?

    iOS开发几年了,你清楚OC中的这些东西么!!!? 前言 几年前笔者是使用Objective-C进行iOS开发, 不过在两年前Apple发布swift的时候,就开始了swift的学习, 在swift1 ...

最新文章

  1. AI寒冬论作者:通用人工智能仍是白日梦
  2. 如何实现一个优质的微服务框架:Apache ServiceComb 的开放性设计
  3. 微服务架构与领域驱动设计应用实践
  4. y2第一章 初始mybatis的上机3_MyBatis3.2.x从入门到精通之第一章
  5. python if后面要不要加括号_Python装饰器兼容加括号与不加括号的写法
  6. ios device provisioning
  7. ConcurrentLinkedQueue的实现原理和源码分析
  8. 手机端刷recovery工具_MIUI/REDMIN手机玩机汇集
  9. 【可临摹UI设计干货】APP UI界面的版式设计理论!
  10. mysql的事务日志_MySQL 事务日志
  11. java拼图游戏Mian_Java拼图游戏源码 MainApp启动器 main(): 创建主界面类对 联合开发网 - pudn.com...
  12. .Net Framework System.Collections 集合类
  13. UE中使用正则表达式的一些技巧
  14. android:background
  15. php mysql显示到页面上_从数据库调出数据显示到页面 PHP+Mysql+Html(简单实例)
  16. Python实现十大排序算法
  17. Abaqus设置初始地应力场
  18. ajax hack,Ajax Hacks-hack9 深入了解HTTP Respon_jquery
  19. Linux系列-快速搞定CentOS7.0网络配置
  20. python怎么解题_农夫过河问题 Python实现解题

热门文章

  1. Taro开发微信小程序遇到的问题和解决方法
  2. 使用jQuery在AJAX请求中添加标头
  3. 如何在函数式编程中存在时间函数?
  4. 如何在JavaScript中声明名称空间?
  5. 在C#中,List struct中的值是否装箱?
  6. 网卡驱动怎么安装方法教程
  7. Android:模拟器使用PC地址上网设置,且访问本地服务器
  8. c语言 哪些运算符左右需要空格,C语言运算符优先级口诀?
  9. socket不能bind请求的地址_深入浅出讲解:php的socket通信
  10. 操作键盘事件源码解析(常用的鼠标事件、 键盘事件对象之keyCode属性)