OC中的类别Category-协议Protocol-…

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

类别(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关键字定义

@protocol 协议名 <父协议1, 父协议2>
{
      //.....方法声明
}
@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)给实现协议的类,这样可以让类具有更好的通用性,具体的动作交给协议的实现类来完成。在大量的应用程序开发中大量依赖委托这个概念。

转自:http://blog.csdn.net/qq_31810357

时间: 2024-11-03 19:24:21

OC中的类别Category-协议Protocol-…的相关文章

Swift中的协议(protocol)学习教程_python

一.引言 协议约定了一些属性与方法,其作用类似Java中的抽象类,Swift中类型通过遵守协议来实现一些约定的属性和方法.Swift中的协议使用protocol关键字来声明.Swift中的协议还有一个十分有意思的特性,协议可以通过扩展来实现一些方法和附加功能. 二.在协议中定义属性和方法 协议中定义的属性只约定名称和类型,在具体类型的实现中,其可以是存储属性也可以是计算属性,协议中还需要指定属性是可读的还是可读可写的.示例代码如下: protocol MyPortocol { //定义实例属性

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

http://blog.csdn.net/shulianghan/article/details/48876843 这个漂亮的文字阴影,搞不到啊,求指教 一. Objective-C 对象简单处理 1. 包装类 (1) 包装类简介 NSValue 和 NSNumber :  -- 通用包装类 NSValue : NSValue 包装单个 short, int, long, float, char, id, 指针 等数据; -- NSNumber 包装类 : 用于包装 C 语言数据类型; NSNu

内核中的多点触摸协议文档 Multi【转】

转自:http://www.arm9home.net/read.php?tid=24754 前段时间改写了一个GT801的内核驱动,仔细阅读 MT Event 上报的时候,发现这个驱动是针对 Android 系统有所偏重的.于是便仔细阅读了一下内核文档中关于多点触摸协议的介绍. 多点触摸的信息,是触摸屏这样的触摸设备向 input core 上报 MT 消息传递的.这些 MT消息,可以通过 设备文件的接口,被应用程序读取到. 整个消息传递过程,以及 上层应用程序(DirectFB / Xorg

ios-iOS中在类别中动态新增了的可变字典属性变成了不可变字典

问题描述 iOS中在类别中动态新增了的可变字典属性变成了不可变字典 想在category中新增个属性来用,创建的可变字典属性,也做了相关关联,结果用不了setobject方法,打印出来一看发现变成了不可变字典类型,希望有大神帮我看看哪里出问题了: static void *myAllPropertiesDicKey = &myAllPropertiesDicKey; @implementation FatherClass (Category) //add setter and getter me

窥探Swift之协议(Protocol)和委托代理(Delegate)回调的使用

协议与委托代理回调在之前的博客中也是经常提到和用到的在<Objective-C中的委托(代理)模式>和<iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流>等博客内容中都用到的Delegate回调.说到协议,在Objective-C中也是有协议的,并且Swift中的协议和Objc中的协议使用起来也是大同小异的,在Java等现代面向对象编程语言中有接口(Interface)的概念,其实和Swift中或者Objc中的Protoco

socket-VBS中Socket通过TCP协议发送数据

问题描述 VBS中Socket通过TCP协议发送数据 问题是一个接着一个: 在使用MSWINsock.Winsock通过TCP发送数据到Server的时候,提示如下错误: 代码如下: Dim sock,socket '赋值sock变量为WINSOCK的对象 Set sock = Wscript.createobject("MSWINsock.Winsock") sock.Protocol = 0 sock.RemoteHost = "10.185.59.51" so

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

前言 几年前笔者是使用Objective-C进行iOS开发, 不过在两年前Apple发布swift的时候,就开始了swift的学习, 在swift1.2发布后就正式并且一直都使用了swift进行iOS的开发了, 之后就是对swift持续不断的学习, 近来swift3.0的发布, 更多的人会选择swift来进行iOS的开发看上去更是成为了一种趋势, 不过一个合格的iOS开发者对oc以及c语言的掌握是必不可少的技能, 本篇中主要是写一些大家平时都可能用到但是不一定知道的oc的东西 oc中的对象的创建

php中获取主机名、协议及IP地址的方法_php技巧

本文实例讲述了php中获取主机名.协议及IP地址的方法.分享给大家供大家参考. 具体实现代码如下: 复制代码 代码如下: $hostname=gethostbyaddr($_SERVER['remote_addr']);    //获取主机名 echo $hostname;            //输出结果 // $hosts=gethostbynamel('localhost');       //获取ip地址列表 print_r($hosts);           //输出数组 // $

设计模式之观察者模式(关于OC中的KVO\KVC\NSNotification)

学习了这么久的设计模式方面的知识,最大的感触就是,设计模式不能脱离语言特性.近段时间所看的两本书籍,<大话设计模式>里面的代码是C#写的,有一些设计模式实现起来也是采用了C#的语言特性(C#的API,抽象类,在OC中是没有抽象类.没有多继承关系),<设计模式之禅>里面的代码是JAVA写的,与OC差距也是比较大. 但是我想,这些都不是问题,学习设计模式主要学习的是其中的思想,并将之改造成自己所熟悉语言的模式,大同小异.所需要注意的是,在学习的过程中,将之与语言结合起来,多思考.多实践