14、OC —— Protocol

1、protocol(协议)类似java中的接口,定义了一些类需要公用到的方法,只要遵守这个协议,就可以拥有这些方法并可以去实现它们,这样可以避免许多重复的代码。

比如,一个Teacher(老师)类,一个Student(学生)类

老师有goToClassroom(去教室),goToToilet(去厕所),goToOffice(去办公室)等方法,学生也有

这样Teacher类和Student类都需要声明重复的代码

Teacher.h

#import <Foundation/Foundation.h>
 
@interface Teacher : NSObject
 
- (void)goToClassroom;
- (void)goToToilet;
- (void)goToOffice;
 
@end

Student.h

#import <Foundation/Foundation.h>
 
@interface Student : NSObject
 
- (void)goToClassroom;
- (void)goToToilet;
- (void)goToOffice;
 
@end

实现方法我就不实现了,如果这时有个协议来制定这些方法,让Teacher和Student都去遵守的话,就不需要重复这么多代码

SchoolDaily.h

#import <Foundation/Foundation.h>
 
@protocol SchoolDaily <NSObject>
 
- (void)goToClassroom;
- (void)goToToilet;
- (void)goToOffice;
 
@end

这时Teacher和Student只需要遵守SchoolDaily协议并实现协议里的方法即可拥有这些方法

Teacher.h

#import <Foundation/Foundation.h>
#import "SchoolDaily.h"
 
@interface Teacher : NSObject <SchoolDaily>
 
@end

Student.h

#import <Foundation/Foundation.h>
#import "SchoolDaily.h"
 
@interface Student : NSObject <SchoolDaily>
 
@end

2、@required代表协议里的方法必须实现,否则编译器会警告,不写默认是@required,@optional代表协议里的方法是选择实现

比如,goToOffice方法Student可以选择不实现

SchoolDaily.h

#import <Foundation/Foundation.h>
 
@protocol SchoolDaily <NSObject>
 
@required
- (void)goToClassroom;
- (void)goToToilet;
 
@optional
- (void)goToOffice;
 
@end

3、协议可以与代理模式相结合

代理模式:委托(delegate),顾名思义就是委托别人办事,就是当一件事情发生后,自己不处理,让被人来处理。

a、在不使用delegate时,Teacher在修改作业前需要Student帮他收作业,则需要拥有学生这个变量

b、学生拥有pickupHomeWork(收作业)这个方法

c、老师拥有checkHemoWork(改作业)这个方法

 Student.h

#import <Foundation/Foundation.h>
 
@interface Student : NSObject
 
- (void)pickupHomework;
 
@end

Student.m

#import "Student.h"
 
@implementation Student
 
- (void)pickupHomework
{
    NSLog(@"学生收作业");
}
 
@end

  

    Teacher.h

#import <Foundation/Foundation.h>
#import "Student.h"
 
@interface Teacher : NSObject
 
@property(nonatomic, strong) Student *stu;
- (void)checkHomework;
 
@end

    Teacher.m

#import "Teacher.h"
 
@implementation Teacher
 
- (void)checkHomework
{
    // 叫学生帮他收作业
    [_stu pickupHomework];
     
    // 自己修改作业
    NSLog(@"老师修改作业");
}
 
@end

d、但是,Teacher和Student的耦合性太强,如果有一天这个Student毕业了,换成了Student2来收作业,Teacher类里要修改的代码也不少

f、使用代理的话,Teacher里就不需要修改代码,只需要把Student换成Student2即可

g、于是老师写了一份协议,只有遵守此协议的才能当他的课代表,才可以去收同学的作业

Homework.h

#import <Foundation/Foundation.h>
 
@protocol Homework <NSObject>
 
- (void)pickupHomework;
 
@end

    Teacher.h

#import <Foundation/Foundation.h>
#import "Homework.h"
 
@interface Teacher : NSObject
 
@property (nonatomic, strong) id<Homework> delegate;
- (void)checkHomework;
 
@end

    Teacher.m

#import "Teacher.h"
 
@implementation Teacher
 
- (void)checkHomework
{
    // 叫学生帮他收作业
    [_delegate pickupHomework];
     
    // 自己修改作业
    NSLog(@"老师修改作业");
}
 
@end


接下来无论是Student还是Student2还有其他阿猫阿狗类,只要遵守老师的协议就可以有权利去收作业了

Student.h

#import <Foundation/Foundation.h>
#import "Homework.h"
 
@interface Student : NSObject <Homework>
 
@end

    Student.m

#import "Student.h"
 
@implementation Student
 
- (void)pickupHomework
{
    NSLog(@"学生收作业");
}
 
@end

需要注意以下几点:

1.id可以表示任何一个ObjC对象类型,类型后面的”<协议名>“用于约束作为这个属性的对象必须实现该协议(注意:使用id定义的对象类型不需要加“*”)

2.在.h文件中如果使用了另一个文件的类或协议我们可以通过@class或者@protocol进行声明,而不必导入这个文件,这样可以提高编译效率

3.在编写代码中,协议代理文件通常以Delegate结尾,因为Delegate是代理的英文,这样做方便以后的管理和交接

4.代理协议文件中一定要包含基协议<NSObject>


时间: 2024-08-26 05:21:02

14、OC —— Protocol的相关文章

Unity3D研究院之IOS全自动编辑framework、plist、oc代码

Unity打IOS时会先生成一个Xcode工程,如果你需要增加一些第三方的framework那么需要手动一条一条的添加,这太烦了..而且可能你还需要修改Plist文件,甚至还可能要修改unity自动生成的oc代码,每次打包都要修改的话,那太累了..这篇文章就是全自动打包的第一步..建议使用XUPorter,我在它的基础上拓展了两个类,一个用来修改plist,一个用来修改unity生成出来的OC代码.文章的最后我会给出代码.. 那么我用一个比较变态的SDK举个例子ShareSDK,它就需要自动添加

关于C、OC、C++、OC++、Swift的一些常识

关于C.OC.C++.OC++.Swift的一些常识 OC是C语言的一个超集,是一门面向对象的语言,因为苹果的崛起而火,API主要是cocoa(OSX)和cocoatouch(iOS),GCC 和 Clang 都能编译OC,现在xcode使用的是Clang. OC的实现是建立在运行时机制(runtime system)之上的(runtime system 使用C写的),这使它与C++的编译机制有很大区别. 简单来说就是OC代码执行的时候需要结合runtime library,实现它的功能.正是因

14、Cocos2dx 3.0游戏开发找小三之Scene and Layer:一场游戏一场梦

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30474393 Scene :场景 了解了Director 之后,接下来介绍 Scene 这个与它紧密相关的游戏组件. 通过之前的学习,我们已经了解了场景以及它在流程控制中的地位. 在 Cocos2d-x 中,Scene 定义了一个场景.场景只是层的容器,包含了所有需要显示的游戏元素. 因此相对于其他游戏元素,Scene 并没有提供什么特别的功能,就是一

14、管理undo

14.管理 oracle undo 1.DML与undo undo data: 原始的.修改之前的数据副本 用于支持:回退操作.读一致性查询.闪回查询.闪回事务处理及闪回表.从失败事务中进行恢复. undo:旧数据 redo:改变的数据 SQL> show parameter undo NAME     TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_m

14、蛤蟆的数据结构笔记之十四栈的应用之栈与递归之阿克曼函数

14.蛤蟆的数据结构笔记之十四栈的应用之栈与递归之阿克曼函数 本篇名言:"今天就是生命 ----- 是唯一你能确知的生命." 继续递归应用,阿克曼函数. 欢迎转载,转载请标明出处: 1.  阿克曼函数 阿克曼函数(Ackermann)是非原始递归函数的例子.它需要两个自然数作为输入值,输出一个自然数.它的输出值增长速度非常高,仅是对于(4,3)的输出已大得不能准确计算. Ackermann函数定义如下: 若m=0,返回n+1. 若m>0且n=0,返回Ackermann(m-1,1

ABP(现代ASP.NET样板开发框架)系列之14、ABP领域层——领域事件(Domain events)

点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之14.ABP领域层——领域事件(Domain events) ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate 在C#中,一个类可以定义其专属的事件并且其它类可以注册该

Windows Phone本地数据库(SQLCE):14、删除数据(翻译)

这是“windows phone mango本地数据库(sqlce)”系列短片文章的最后一篇第十四篇. 为了让你开始在Windows Phone Mango中使用数据库,这一系列短片文章将覆盖所有你需要知道的知识点.我将谈谈在windows phone mango本地数据库里怎么删除数据. 从数据库里删除数据是一个三个步骤的过程.首先,从数据库里查询要删除的对象,然后,根据你要删除的一个或多个对象,调用DeleteOnSubmit方法或者DeleteAllOnSubmit 方法删除,分别使这些对

13、如何拆分含有多种分隔符的字符串 14、如何判断字符串a是否以字符串b开头或结尾 15、如何调整字符串中文本的格式 16、如何将多个小字符串拼接成一个大的字符串

13.如何拆分含有多种分隔符的字符串 import re s = "23:41:2314\1234#sdf\23;" print(re.split(r'[#:\;]+',s))  14.如何判断字符串a是否以字符串b开头或结尾 import os,stat #找到当前目录下的文件名称,返回list ret = os.listdir('.') print(ret) for x in ret: #endswith传参类型是tuple if x.endswith(('.py','.html'

14、 Integer 与 int 的区别

14. Integer 与 int 的区别int 是 java 提供的8种原始数据类型之一. Java 为每个原始类型提供了封装类, Integer 是 java为 int 提供的封装类. int 的默认值为0,而 Integer 的默认值为 null,即 Integer 可以区分出未赋值和值为0的区别, int 则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用 Integer.在 JSP 开发中, Integer 的默认为 null,所以用el 表达式在文