OC基础回想(十二)协议

在OC基础(十一)中我们讨论了类别和非正式协议的奇异之处。在使用非正式协议时。能够仅仅实现你想要获得响应的方法。也不必在对象中声明不论什么内容来表示该对象可用作托付对象。

全部这些任务能够用最少的代码完毕。

以下来学习正式协议。

1. 正式协议

与非正式协议一样。正式协议包括了方法和属性的有名称列表。

但与非正式协议不同的是,正式协议须要显示地採用。採用(adopt)协议的办法是在类的@interface声明中列出协议的名称。採用协议后,你的类就要遵守该协议。採用协议就意味着你承诺实现该协议的全部方法。否则,编译器会生成警告来提醒你。

1.1 声明协议

声明一个协议的方法很easy:

@protocol myProtocol <NSObject>
 @required
-(void)protocolMethodA:(NSString *)string;
@optional
-(void)protocolMethodB:(NSString *)string;
@end

说明:

(1)第一行是声明这个协议的名字为myProtocol。尖括号里的NSObject本身也是一个协议,当中定义了非常多主要的协议函数。比方performSelector。isKindOfClass,respondsToSelector,conformsToProtocol,retain,release等。

(2)协议接口分为required和optional两类。required顾名思义是说遵守这个协议的那个类“必需要”实现的接口,而optional则是能够实现也能够不实现的。协议接口的定义和普通的函数定义是一样的。

(3)最后一行@end表示协议定义结束。这个协议的定义一般是在.h文件里。

1.2 定义一个类遵循这个协议

@interface myClass <myProtocol>
@intrerface myClass : NSObject <myProtocol>
@interface myClass : NSObject <myProtocol, NSCoding>

说明:

上面各自是三种不同的情况。编译的时候编译器会自己主动检查myClass是否实现了myProtocol中的必要的(@required)接口。假设没有实现则会发出一个警告信息。另外须要注意的是,假设有继承自myClass的子类,这些子类也是会自己主动遵循myClass所遵循的协议的。并且也能够重载这些接口。

2.为什么要使用正式协议

苹果的官方文档指出三个原因:

  • To declare methods that others are expected to implement
  • To declare the interface to an object while concealing its class
  • To capture similarities among classes that are not hierarchically related

事实上还有第四个非常重要的原因,那就是降低继承类的复杂性。一个经典的样例就是iOS UI框架里面的UITableViewController类。假如没有“协议”功能。用户就必须选择用继承和重载接口的方法来实现复杂的UI控制以及其它事件的处理——这就对基类的设计提出了更大的挑战了。对于像这样一个table
view,一个非常好的实现方法就是採用协议,由协议里的接口来控制不同的数据源以及各种复杂的用户操作。

UIKit中设计了两个非常好的协议UITableViewDelegate,UITableViewDataSource来实现UITableViewController的控制。

不论什么遵循这两个协议的类都能够实现对UITableView的控制。

3.关于id类型的运用

id 类型在iOS中是一个通用类型,有点类似C语言的void*类型。编译器不能检查到定义为id类型的变量的实际类型,id类型的识别是发生在执行时阶段。可是我们能够用 id<protocol_name> obj;这种语法形式在编译阶段就能够让编译器知道obj仅仅能够发送protocol_name中的消息,假设所发送的消息不在protocol_name中,编译器会给一个警告信息“Instance
method ‘xxxx:‘ not found......”。

这样的情况多用于代理模式的实现。比方某一个类有一个delegate 的property:

id <myProtocol> delegate;

这样。在编译阶段我们就能够知道用delegate所发送的消息是不是在它所遵循的myProtocol中的消息。好了。 到这里笔者钻起了牛角尖,我把id后面的 <myProtocol>删掉。然后用delegate发送一个并不存在于myProtocol中的消息。结果编译器还是给了“Instance
method ‘xxxx:‘ not found......”的警告信息。

更奇怪的是,当发送一个存在于myProtocol中的消息时,编译器居然没有这种警告信息。这两个測试并不能说明之前的解释是错误的,姑且觉得id<myProtocol> delegate这种写法是为了便于知道这个delegate遵循了myProtocol的协议吧

时间: 2024-08-11 01:34:45

OC基础回想(十二)协议的相关文章

OC基础(十二)协议

在OC基础(十一)中我们讨论了类别和非正式协议的奇妙之处.在使用非正式协议时,可以只实现你想要获得响应的方法.也不必在对象中声明任何内容来表示该对象可用作委托对象.所有这些任务可以用最少的代码完成. 下面来学习正式协议. 1. 正式协议 与非正式协议一样,正式协议包含了方法和属性的有名称列表.但与非正式协议不同的是,正式协议需要显示地采用.采用(adopt)协议的办法是在类的@interface声明中列出协议的名称.采用协议后,你的类就要遵守该协议.采用协议就意味着你承诺实现该协议的所有方法.否

OC基础(十二)内存简单介绍和OC的内存管理

一.内存简单介绍 内存结构 1.运行时分配 (1)栈:用户存放程序临时创建的局部变量(先进后出). (2)堆:动态分配内存段. 2.编译器分配 (1)BSS段:存放未初始化的全局变量和静态变量. (2)数据段:已初始化的全局变量和静态变量. (3)代码段:执行代码的一块区域. 地址由低到高:代码段 -> 数据段 -> BSS段-> 堆 -> 栈 内存分配方式 1.从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量

Java Script基础(十二) 正则表达式

Java Script基础(十二) 正则表达式 一.正则表达式中常用的符号 虽然可以使用string函数来完成验证,但是这种验证方式不够严谨,而且编写比较麻烦.而正则表达式是一种描述字符模式的对象,由一些特殊的符号组成,其组成的字母模式用来匹配各种表达式.下表中列举出常用的符号和用法. 正则表达式中常用的符号和用法 符号 描述  /....../  代表一个模式的开始和结束.  ^  匹配字符串的开始   $  匹配字符串的结束  \s  任何空白字符   \S  任何非空白字符   \d  匹

黑马程序员--oc基础第十篇(foundation框架下、集合)

十 . oc基础(Foundation框架下) 1.下面介绍几种OC对象类型的存储结构:NSArray,NSDictionary,NSSet,以及基本数据类型封装类. NSNumber:*既然这几种数据结构都是用来存放对象类型的那么基本数据类型想要放入其中就要先对他们进行封装.使用NSNumber对基本数据类型进行封装. // // Created by keeganlee on 15/3/2. // Copyright (c) 2015年 keeganlee. All rights reser

java基础知识十二

第十二章 异常 异常(Exception):又称为例外,是程序在运行过程中发生的非正常事件,其发生会影响程序的正常执行.Exception是程序级错误,可由程序本身处理:Error是系统级错误,程序可不用处理.Java异常类都必须继承Throwable类或其子类.用户通过继承自定义异常.常见异常:除数为零.负数开方.数组越界.I/O异常. 抛出的异常由catch捕获,未被捕获的异常逐层传播直到main.如果main也没有处理该异常,则操作系统会终止main执行. 处理异常时,也可以抛出新异常,也

JavaSE基础笔记十二

第十一章 多线程 理解程序.进程.线程的概念 程序可以理解为静态的代码. 进程可以理解为执行中的程序. 线程可以理解为进程的近一步细分,程序的一条执行路径. 2.如何创建java程序的进程(重点) 方式一:继承于Thread类 ①创建一个继承于Thread的子类 ②重写Thread类的run()方法,方法内实现此子线程要完成的功能 ③创建一个子类的对象 ④调用线程的start():启动此线程,调用相应的run()方法 ⑤一个线程只能够执行一次start 方式二:实现Runnable接口 ①创建一

Oracle基础笔记十二

第十二章 用户控制权限 1.权限: 数据库安全性:系统安全性和数据安全性 系统权限: 对于数据库的权限 对象权限: 操作数据库对象的权限 2.系统权限 超过一百多种有效的权限 数据库管理员具有高级权限以完成管理任务,例如: 创建新用户 删除用户 删除表 备份表 2.1 DBA 使用 CREATE USER 语句创建用户 CREATE USER user IDENTIFIED BY   password; CREATE USER  scott IDENTIFIED BY   tiger; 2.2

OC基础--分类(category) 和 协议(protocol)

OC 中的category分类文件相当于 C#中的部分类:OC 中的protocol协议文件(本质是头文件)相当于 C#中的接口.今天就简单说明一下OC中的这两个文件. 由于视频中的Xcode版本低,导致了分类文件和协议文件没有找到,最后百度得知: 如图:Xcode 7.2版本中的category文件和protocol文件都归类到了Objective-C File 中   一.category文件: 作用:可以扩展自定义类,或者系统类.下面的实例,是扩展了NSString 类,在类中扩展了计算字

iOS开发——网络编程OC篇&amp;(十二)AFN详解

AFN详解 众所周知,苹果搞的一套框架NSContention发送请求与接收请求的方式十分繁琐.操作起来很不方便.不仅要做区分各种请求设置各种不同的参数,而且还要经常在多线程里操作,同时还要对请求与返回的数据做各种序列化的操作,同时还要考虑请求数据的安全等一堆问题. 一.早前的几个网络框架 1.ASI框架: HTTP终结者.很牛, 但是有BUG, 已经停止更新. 2.MKNetworkKit (印度人写的). 3.AFN一直还在更新. AFNetworking的出现:MAC/iOS设计的一套网络