结合之前的学习笔记以及参考《Objective-C编程全解(第三版)》,对Objective-C知识点进行梳理总结。知识点一直在变,只是作为参考,以苹果官方文档为准~


八、正式协议和非正式协议


1、协议概念:protocol(File->Objective-C file->file+protocol)
表示对象的作用和行为的方法的集合体(白话就是用来声明一些方法,可由任意类来实现,只要遵守协议就可以)
遵循某一协议,就相当于拥有了这个协议中的所有的方法声明,在类中就不必重新声明了

2、关于协议
(1)协议只是声明,只有头文件;不是类,不能声明成员变量;
(2)父类遵循某一协议,子类因继承关系也遵循该协议;
(3)OC允许一个类遵循多个协议,<A,B,C……>逗号隔开,但OC只能单继承;
(4)协议可以遵循协议,相当于追加另一组方法来产生新的协议;

3、语法(例如定义一个ProtocolA.h)

 #import <Foundation/Foundation.h>@protocol ProtocolA <NSObject>//必须实现的方法@required- (void)methodA;- (void)methodB;//可不实现的方法@optional- (void)methodC;@end

定义MusicPlayer类遵循ProtocolA协议

 MusicPlayer.h#import <Foundation/Foundation.h>#import "ProtocolA.h"  //不要忘了包头文件//表示MusicPlayer这个类遵循ProtocolA.h这个类@interface MusicPlayer : NSObject <ProtocolA>@end
 MusicPlayer.m#import "MusicPlayer.h"@implementation MusicPlayer- (void)methodA {//    必须实现否则警告}- (void)methodB {//    必须实现否则警告}- (void)methodC {//    可不实现}@end

4、在上述语法中已经提及@required和@optional关键字
虽然@required必须实现的方法你不写,也只是报警告而已,运行仍正常
两个关键字主要用于方便程序员之间的交流


5、协议和分类的异同重点!面试常考!
相同点:都可以声明一些方法,但是不能定义成员变量
不同点:
(1)分类是某个类扩充一些方法,按照功能把方法进行分类。而遵循协议的类可以拥有协议中方法的声明
(2)协议只是声明,不需要方法的实现,分类中需要有方法的实现


6、基协议
(1)NSObject基类,所有的OC类都继承这个基类;
(2)也有一个协议NSObject叫基协议,最根本的协议;
(3)基协议声明很多方法:description,performSeletor等,建议所有新创建的协议都遵循基协议

7、定义实例对象遵循某协议

 id<ProtocolA> obj = [[MusicPlayer alloc] init];MusicPlayer<ProtocolA> *obj1 = [[MusicPlayer alloc] init];

8、类中的成员变量遵循某协议

 @property id<ProtocolA> obj;

9、非正式协议:之前讲得都是正式协议
将一组方法声明为NSObject的分类称为非正式协议
相关概念

-非正式协议被声明为NSObject类的分类;

-非正式协议中声明的方法不一定要实现;

-编译时,不能检查类对非正式协议的实用性;

-运行时,不能检查类对非正式协议的实用性。只能确认是否实现了每个方法。respondsToSelector来判断是否已实现。

作用:
在Cocoa中,从系统(框架)方调用用户编程方的对象来互发消息时,经常会使用非正式协议。——选择器判断是否实现,实现了就进行什么操作,没实现就进行另外的操作之类的~
(对于非正式协议的理解还不是非常透彻~)

Objective-C(八、正式协议Protocol,非正式协议informal protocol)——iOS开发基础相关推荐

  1. OC正式协议和非正式协议

    1.概念 非正式协议,非正式协议是NSObject类(包括它的子类)的类别,其所有的子类都含蓄地接受了这个协议.非正式协议中的方法是否实现都是可选的,因此在调用非正式协议中的方法之前,需要去检查对象类 ...

  2. OC正式协议和非正式协议的区别

    最近看了些关于objective-c的正式协议和非正式协议的内容,发现还是有些混乱,可能是因为还不熟悉OC,对正式协议和非正式协议的使用还不是很熟练,所以想整理一下 非正式协议,是使用类别catego ...

  3. OC的正式协议和非正式协议

    最近看了些关于objective-c的正式协议和非正式协议的内容,发现还是有些混乱,可能是因为还不熟悉OC,对正式协议和非正式协议的使用还不是很熟练,所以想整理一下 非正式协议,是使用类别catego ...

  4. Objective-C(十八、谓语使用及实例说明)——iOS开发基础

    结合之前的学习笔记以及參考<Objective-C编程全解(第三版)>,对Objective-C知识点进行梳理总结.知识点一直在变,仅仅是作为參考,以苹果官方文档为准~ 十八.谓语的使用及 ...

  5. Objective-C非正式协议与正式协议

    为什么80%的码农都做不了架构师?>>>    类别与类扩展的区别: ①类别中只能增加方法: ②是的,你没看错,类扩展不仅可以增加方法,还可以增加实例变量(或者合成属性),只是该实例 ...

  6. Object-C非正式协议与正式协议的区别

    Object-C非正式协议与正式协议的区别 Object-C非正式协议与正式协议的区别 - braddoris的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/br ...

  7. 2016 - 2- 2 非正式协议与正式协议

    在重温<OBJC编程基础>这本书时,对于非正式协议的感觉非常陌生,阅读了一篇王中周的博客,结合自己在书中阅读的内容,做一些总结. 一.非正式协议 显然这个名词是相对于正式协议而言的.在解释 ...

  8. 非正式协议和正式协议的区别

    这两个概念困扰我很久了,一直都很像搞清楚到非正式协议和正式协议有什么区别和联系,下面结合网上的资料和自己的看法谈谈这个问题. 一.非正式协议 显然这个名词是相对于正式协议而言的.在解释非正式协议之前, ...

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

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

最新文章

  1. 搜狗CEO王小川:AI领域存在泡沫 但留下的是珍珠
  2. CSS3学习手记(1) 选择器
  3. VS2015+MySql+EF6采坑经验总结
  4. Hadoop自动安装脚本
  5. vnc远程桌面复制文件Linux,vncviewer远程桌面linux
  6. [转载]C#时间函数
  7. macos 致命错误: 在类路径或引导类路径中找不到程序包 java.lang
  8. 05-Flutter移动电商实战-dio基础_引入和简单的Get请求
  9. 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)...
  10. java jtextarea 显示_Java开发网
  11. 5.Knockout.Js(自定义绑定)
  12. 使用百度云OCR识别文字
  13. Java如何实现代理服务器?
  14. 微信小程序 布局对齐属性
  15. ubuntu系统安装socket服务器,ubuntu 服务器安装socket需要安装啥
  16. 腐烂国度计算机配置要求,腐烂国度一周年求生版配置要求 略有小幅度提升
  17. HR面必问问题——和HR斗智斗勇(数字IC,FPGA,计算机,JAVA,算法,C++,产品,芯片通用)
  18. azkaban报Error Chunking during uploading files to db
  19. 华硕x580nv拆机_看懂一篇拆机贴 拆遍天下机 华硕A45VM拆机清灰换硅脂 怒降25度!...
  20. GIthub上关于新冠肺炎数据整理的项目汇总

热门文章

  1. 伽马校正(gamma correction)学习笔记
  2. 深度学习模型训练和关键参数调优详解
  3. HackMyvm(三)Hotel持续更新
  4. 《InsideUE4》-6-GamePlay架构(五)Controller
  5. 一道HashSet面试题引发的蝴蝶效应
  6. matlab拉氏逆变换,偏微分方程的拉氏变换解法.ppt
  7. java半球最多_多是东半球最全的RxJava使用场景小结
  8. OC与C语言的一些区别
  9. 家庭助理简介(home assistant)
  10. 【yum】常见的yum命令