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


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

#import 
#import "Buy.h"
@interface Person : NSObject <<span style="color: rgb(79, 129, 135);">Buy>
-(void)eat;
@end

实现如下:

#import "Person.h"
@implementation Person
-(void)buy//实现协议方法
{
    NSLog(@"Buy something---Protocol Method");
}
//这是一个公有方法,因为在.h有声明,第三方也可以用。
-(void)eat
{
    NSLog(@"I'm eating-Person Class");
} //这是一个私有方法。因为只在.m文件中定义,而没有在.h文件中声明
-(void)playFootball
{
    NSLog(@"Bob playing football--Private Method");
}
@end

例如,考虑为Person增加一个类别,则接口部分代码如下


#import
@interface Person (OtherMethod)
-(void)sleep; @end

该类别的实现部分如下


#import "Person+OtherMethod.h"
@implementation Person (OtherMethod)
-(void)sleep
{
    NSLog(@"I'm sleeping--Category");
}
@end

所有Person类的实例就都会具有sleep方法,从而实现对Person类的动态扩展。

我们知道,如果一个函数在.h文件中无声明而在.m文件中定义它的实现,那么该方法就是私有方法,只能在本类的文件中使用。  若我们在类别的接口部分声明这个方法,那么我们就可以实现对该私有方法的访问。

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

扩展(extension)

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


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

在用法上,类别通常都都有单独的.h和.m文件。扩展则是临时的对某个类进行扩展,类的实现部分同时实现类接口部分定义的方法和扩展中定义的方法。定义类的扩展时,可以增加额外的实例变量,也可使用@property和@synthesize关键字,但在定义类的额外列表时不允许额外定义实例变量。

有类名为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)

以NSObject为基础,为NSOject创建类别,创建类别时指定该类新增的方法,既可以实现非正式协议。而OC中对于实现非正式协议的类而言,OC并不强制实现该协议中的所有方法

正式协议使用@protocol关键字定义


, 父协议>
{
      //.....方法声明
}
@end

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

遵守协议的语法如下


@interface 类名:父类型 <<span class="title">协议1, 协议2...>

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

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


NSObject<<span class="title">协议1,协议2..>*变量名;
id<<span class="title">协议1,协议2...> 变量;

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

最新文章

  1. 深入浅出Mybatis系列(九)---强大的动态SQL
  2. mvc中多参数URL会很长,首次加载不传参数让url很短,路由规则实现方法[bubuko.com]
  3. Swift开发第七篇——字面量转换&amp;下标
  4. 实践JAVA wait(), notify(),sleep方法--一道多线程的面试题
  5. 元数据和DbUtils
  6. LNMP环境搭建配置memcache
  7. UML建模之状态图(Statechart Diagram)
  8. 《C++ Primer Plus 6th》读书笔记 - 第十一章 使用类
  9. 基于visual Studio2013解决C语言竞赛题之0422牛顿迭代法
  10. nefu 115 斐波那契的整除
  11. MySQL监听数据库存储过程出现异常
  12. 《深入理解Java虚拟机》——Java内存区域与内存溢出异常
  13. Leetcode_171_Excel Sheet Column Number
  14. C/C++ strict-aliasing
  15. guxh的python笔记七:抽象基类
  16. Substrings (C++ find函数应用)
  17. Docker 简单查看name和ip
  18. java使用javax.mail进行免费的邮件发送
  19. opencv学习笔记之cvSobel 函数解析
  20. xpack文件打包解包代码库

热门文章

  1. 分享一个二维码图片识别控制台程序Demo
  2. ABP文档笔记 - 配置、设置、版本、功能、权限
  3. ACM 今年暑假不AC
  4. Docker实例:创建一个点到点连接
  5. Python3 多线程
  6. 给PLSQL插上飞翔的翅膀-PLSQL优化
  7. CentOS7: How to install Desktop Environments on CentOS 7?
  8. RxJava操作符(06-错误处理)
  9. lucene查询索引库、分页、过滤、排序、高亮
  10. 使用std::vector优化点云动画显示一例