1.什么是协议?

2.协议与类别的声明和使用

1.什么是协议?

  在Objective-C中,不支持多继承,即不允许一个类有多个父类,但是OC提供了类似的实现方法,也就是协议。协议有点类似于Java里的接口,不同点就是在协议里,可以提供可选的方法,不要求全部继承。

  协议包括正式协议和非正式协议。

  正式协议:其声明一个方法列表,协议的实现者需要实现声明的方法,可以使用@required和@optional关键字指定方法必须实现或可选实现,默认为必须实现。子类会继承其父类采用的协议,一个协议本身也可以采用别的协议

  非正式协议(类别):类别是Objective-C的一个语言特点,可以让你在无需子类化的前提下为一个类增加方法。凡是NSObject或其子类的类别,都是非正式协议。一个类不必实现非正式协议中的每个方法,只需实现它想要的方法就可以。声明非正式协议的类在向某个目标对象发送协议消息之前,必须首先向它发送respondsToSelector:消息并得到肯定的回答,才可以使用。

2.协议与类别的声明和使用

  正式协议的声明很简单,在类声明的上方

@protocol ProtocolName

//方法声明

@end

在另一个采纳协议的类中声明

@interface ClassName:NSObject<NSCopying>

{

//实例变量

}

//方法

@end

  也可以采用多个协议,只需用逗号隔开

@interface ClassName:NSObject<NSCopying,NSCoding>

{

//实例变量

}

//方法

@end

  声明可选和必须实现的协议

@protocol ProtocolName
- (void)requiredMethod;
@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;
@required
- (void)anotherRequiredMethod;
@end//MyProtocol

  非正式协议(类别)声明和使用,类别名也要符合骆驼命名法。类别的声明和实现可以放在单独的 ”类别名.h/类别名.m“中,也可以放在已有类的.h/.m文件中。

  在类别的.m文件中加入@interface和@end,在这中间可以声明私有方法。

@interface ClassName(categoryName)

//方法定义

@end

  实现

@implementation ClassName(categoryName)
//方法实现
@end

  需要注意的是类别只能添加方法,不能添加实例变量。

------------------------------------------------------------------------------------------------------------------------

  不声明类别名的时候,是匿名类别或类扩展,可以为已存在的类添加实例变量,方法。只能放置在已有类的.h/.m中

@interface ClassName(){

  //实例变量--只能在自身类内使用

}

//方法定义--在.h文件中声明为公开的,在.m中声明的方法为私有的。

@end

Objective-C中的协议(Protocol)和类别(Category)的更多相关文章

  1. Objective-C 中的协议(@protocol)和接口(@interface)的区别

    Objective-C 中的协议(@protocol),依照我的理解,就是C#, Java, Pascal等语言中的接口(Interface).协议本身不实现任何方法,只是声明方法,使用协议的类必须实 ...

  2. Swift和Objective-C中的协议(protocol)有什么异同

    Swift和Objective-C中的protocol的相同点在于:两者可以被用作代理.Objective-C中的protocol类似于Java中的Interface,在实际开发中主要用与适配器模式( ...

  3. Objective中的协议(Protocol)

    Objective中的协议(Protocol) 作用: 专门用来声明一大堆方法. (不能声明属性,也不能实现方法,只能用来写方法的声明). 只要某个类遵守了这个协议.就相当于拥有这个协议中的所有的方法 ...

  4. 关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol

    关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category, ...

  5. 协议 protocol

    协议声明类需要实现的的方法,为不同的类提供公用方法,一个类可以有多个协议,但只能有一个父类,即单继承.它类似java中的接口. 正式协议(formal protocol)--------------- ...

  6. Objective-C:继承、分类(Category、extension)、协议(protocol),个人理解,仅供参考

    总结:继承.分类(Category.extension).协议(protocol)   一.继承: (1)特点: 继承多用于一般父类中的方法功能比较齐全,子类从父类继承过来使用,可以省略很多重复的代码 ...

  7. Server-Speaks-First 有点坑,Linkerd 2.10 中的协议检测和不透明端口

    协议检测(Protocol detection),顾名思义,允许 Linkerd 自动检测 TCP 连接中使用的协议. Linkerd 的设计原则之一是"just work",协议 ...

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

    协议与委托代理回调在之前的博客中也是经常提到和用到的在<Objective-C中的委托(代理)模式>和<iOS开发之窥探UICollectionViewController(四) - ...

  9. DNS 中的协议字段详细定义

    DNS中的协议字段定义 Table of Contents 1 概述 2 DNS Classes 3 DNS OpCodes 4 DNS RCODEs 5 DNS Label Types 6 DNS资 ...

随机推荐

  1. Linux kernel ‘fib6_add_rt2node’函数安全漏洞

    漏洞名称: Linux kernel ‘fib6_add_rt2node’函数安全漏洞 CNNVD编号: CNNVD-201307-265 发布时间: 2013-07-16 更新时间: 2013-07 ...

  2. GitHub上线Trending功能,帮你轻松找到有潜力的开源项目

    转自:http://www.csdn.net/article/2013-08-14/2816574-Github-Trending-Open-Source-Project Github开源项目 摘要: ...

  3. IIS7授权错误:“无法验证对路径的访问”的解决方法

    解决方法: iis7 无法验证对路径的访问 1.打开IIS 7管理器,鼠标单击定位到出现了这个错误的网站. 2.在IIS 7管理器的右边,选择“基本设置”. 3.在弹出的“编辑网站”对话框中,单击“连 ...

  4. 使用Array

    public class UsingArray {     public static void output(int[]Array)     {         if(Array!=null)    ...

  5. Fill-倒水问题(Uva-10603-隐式图路径寻找问题)

    原题:https://uva.onlinejudge.org/external/106/10603.pdf 有三个没有刻度的杯子,它们的容量分别是a, b, c, 最初只有c中的杯子装满水,其他的被子 ...

  6. Selenium webdriver firefox 路径设置问题

    问题: Cannot find firefox binary in PATH. Make sure firefox is installed. 原因:selenium找不到Firefox浏览器. 方法 ...

  7. runtime 如何实现 weak 属性

    出题者简介: 孙源(sunnyxx),目前就职于百度 整理者简介:陈奕龙(子循),目前就职于滴滴出行. 转载者:豆电雨(starain)微信:doudianyu 要实现 weak 属性,首先要搞清楚 ...

  8. Mac内建Apache开机启动

    取消: sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 添加: sudo launchctl ...

  9. 30余套系统模版|DIV+CSS网页模板|简洁大气系统模板

    30余套系统模版|DIV+CSS网页模板|简洁大气系统模板.都是一些后台系统的模版,很适合开发一些管理系统,办公系统,网站后台系统等.使用很广泛,很实用的系统模版. 下载地址: 点击下载

  10. Delphi图像处理 -- RGB与HSL转换

    阅读提示:     <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM.     <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...