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

结合之前的学习笔记以及参考《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中,从系统(框架)方调用用户编程方的对象来互发消息时,经常会使用非正式协议。——选择器判断是否实现,实现了就进行什么操作,没实现就进行另外的操作之类的~
(对于非正式协议的理解还不是非常透彻~)

你可能感兴趣的:(协议,oc,ios开发基础,非正式协议,协议与分类)