iOS阶段学习第19天笔记(协议-Protocol)
iOS学习(OC语言)知识点整理
一、关于协议(Protocol)的介绍
1)概念:协议指多个对象之间协商的一个接口对象,协议提供了一些方法用在协议的实现者和代理者
之间通讯的一种方式
2)声明一个协议@protocol协议的名字<基协议> 一个协议可以遵守另一个协议:
基协议(这个协议就拥有了基协议中所有方法的声明)
3)协议中不能声明成员变量,只能有方法声明。
4)协议中声明方法,默认是required 表明方法是必须要实现的,否则会有系统警告,但不会报错
5)协议中@optional表明方法是可选的(可以实现也可以不实现)
6)使用协议:某个类遵守协议,类名后面<协议名> ;所谓遵守协议就是:类拥有了协议中所有方法的声明,
必须实现协议中规定的方法;一个类可以遵守多个协议(类拥有所有协议中声明的方法,必须实现所有
协议中规定的方法)
7)一个协议可以遵守另一个协议,遵守协议后就拥有了另一个协议所有方法的声明,同时还可以添加自己的方法
8)一个协议可以遵守多个协议,并拥有所有基协议的方法
9)协议的声明与使用方法 实例代码:
1、添加一个基于Protocol命名为MyProtocol的.h 文件 声明一些协议方法 例如:
#import <Foundation/Foundation.h>
@protocol MyProtocol <NSObject>
//协议中不能声明成员变量,只有方法
//{
// int _a;
//}
//协议中声明方法,默认是required
-(void)test1;
-(void)test2;
//@required表明方法是必须要实现的
@required
-(void)test3;
//@optional表明方法是可选的(可以实现也可以不实现)
@optional
-(void)test4;
@end
2、定义一个Person类 在.h文件中使用协议MyProtocol 例如:
#import <Foundation/Foundation.h>
#import "MyProtocol.h"
@interface Person : NSObject<MyProtocol>
@property(nonatomic,copy)NSString *name;
-(void)print;
@end
3、在Person类的.m文件中实现协议方法 例如:
#import "Person.h"
@implementation Person
-(void)print
{
NSLog(@"person:%@",self.name);
}
//实现协议中规定的方法
-(void)test1
{
NSLog(@"test1");
}
-(void)test2
{ }
-(void)test3
{ } @end
4、在main文件中执行方法 例如:
Person *p1=[[Person alloc]init];
//判断p1所属的类是否遵守了协议
if([p1 conformsToProtocol:@protocol(MyProtocol)]){
//判断p1所属的类是否实现了方法
if([p1 respondsToSelector:@selector(test1)]){
[p1 test1];
}
} NSObject *obj1=[[NSObject alloc]init];
obj1=nil;
NSObject *obj2=@"hello";
obj2=nil;
//对obj3指向的对象做一个限制
NSObject<MyProtocol> *obj3=@"abc";
//obj4可以指向任意类型的对象,但是必须遵守MyProtocol协议
id<MyProtocol> obj4=[[Person alloc]init];
Person<MyProtocol> *obj5=[[Person alloc]init];
10)OC中没有多继承,但可以通过协议实现,可通过使用多个协议来实现类似多继承的方法。
11)协议主要用来统一规范接口;统一接口的方法:继承和协议
12)协议与继承的区别
1、继承也可以统一规范接口:子类继承父类所有的方法(可以不用重写,除非父类的方法不适合子类),
重写后的方法名与父类一样,达到了统一接口的目的;子类中可以增加成员变量
2、协议:一个类遵守协议,类就具有协议中所有的方法,如果多个类都遵守同一个协议,这些类都有协议
中规范的方法,达到了统一接口的目的;协议中不能有成员变量
iOS阶段学习第19天笔记(协议-Protocol)的更多相关文章
- iOS阶段学习第21天笔记(ARC内存管理-Copy-代理)
iOS学习(OC语言)知识点整理 一.OC 中的ARC内存管理 1)ARC中释放对象的内存原则:看这个对象有没有强引用指向它 2)strong:强引用,默认情况下的引用都是强引用 3) weak:弱引 ...
- iOS阶段学习第29天笔记(UITextField的介绍)
iOS学习(UI)知识点整理 一.关于UITextField的介绍 1)概念: UITextField 是用于接收用户输入的一个控件 2)UITextField 初始化实例代码: //创建一个UIt ...
- iOS 阶段学习第七天笔记(函数、递归)
iOS学习(C语言)知识点整理笔记 一.函数 1)概念:具有特定功能的代码块的封装 2)函数的定义: 函数类型+函数名(形参列表) 函数类型 函数名(形参类型1 形参名1,形参类型2 形参名2 ...
- iOS阶段学习第三天笔记(运算符)
iOS学习(C语言)知识点整理笔记 1.运算符 一.算术运算符 1)表达式由变量.常量.运算符构成,有确定的类型和值 2)算术运算符包括: +(加),-(减),*(乘),/(除),%(模) 3)算术运 ...
- iOS 阶段学习第三天笔记(运算符)
iOS学习(C语言)知识点整理笔记 1.运算符 一.算术运算符 1)表达式由变量.常量.运算符构成,有确定的类型和值 2)算术运算符包括: +(加),-(减),*(乘),/(除),%(模) 3)算术运 ...
- iOS阶段学习第32天笔记(页面传值方法介绍)
iOS学习(UI)知识点整理 一.界面传值方法 1.方法一 Block传值 通过SubView视图的Block向View视图传值改变View视图的背景色 实例代码: 1)SubViewContro ...
- iOS阶段学习第30天笔记( UIViewController—Delegate(代理) )
iOS学习(UI)知识点整理 一.UIViewController的介绍 1)概念:UIViewController 即视图控制器,用来管理和控制页面跳转的一个类 ,iOS里面采用了MVC的体系结构, ...
- iOS阶段学习第20天笔记(MRC内存管理)
iOS学习(OC语言)知识点整理 一.OC中的内存管理 1)概念:内存管理的对象为所有继承了NSObject的对象,对基本数据(如:int .float.double...)无效 OC中采用 ...
- iOS阶段学习第18天笔记(Plist-Archiver-归档与解归档操作)
iOS学习(OC语言)知识点整理 一.归档与解归档的操作 1)归档是一个过程,将一个或多个对象存储起来,以便以后可以还原,包括将对象存入文件,以后再读取 将数据对象归档成plist文件 2)plist ...
随机推荐
- 自制Unity小游戏TankHero-2D(2)制作敌方坦克
自制Unity小游戏TankHero-2D(2)制作敌方坦克 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的. ...
- Spring-Context之八:一些依赖注入的小技巧
Spring框架在依赖注入方面是非常灵活和强大的,多了解点一些注入的方式.方法,绝对能优化配置. idref idref属性可以传入一个bean的名称,虽然它是指向一个bean的引用,但是得到的是该b ...
- IOS Animation-CAKeyframeAnimation例子(简单动画实现)
在阅读本文之前,可以看看 CABasicAnimation的例子 也可以看看IOS Animation-CABasicAnimation.CAKeyframeAnimation详解&区别&am ...
- 《Node.js实战(双色)》作者之一——吴中骅访谈录
- redis常用操作总结
在项目中时常会用到redis,redis看起来好像很难的样子,而且我也确认反复学习了很久,但是,总结下来,自己使用到的东西并不太多,如下作一些总结工作. 1.安装(单机) 1.1 windows, 直 ...
- 【管理心得之三十二】PMP杂谈---------爱情必胜术
这次一反常态,没有场景设计,我想借此文普及一下PMP是什么? 但我不知道这样枯燥的话题能否能引起你的兴趣,我不得不套用“标题党”<爱情必胜术>来博你眼球. 我真没有说谎,此文是献给那些孤身 ...
- vue-cli需要的包
vue-cli需要的包 npm install webpack webpack-dev-server --save-dev npm install vue-loader vue-html-loader ...
- MySQL(五) MySQL中的索引详讲
序言 之前写到MySQL对表的增删改查(查询最为重要)后,就感觉MySQL就差不多学完了,没有想继续学下去的心态了,原因可能是由于别人的影响,觉得对于MySQL来说,知道了一些复杂的查询,就够了,但是 ...
- Docker 有什么优势?
1.什么是容器? 依托与linux 内核功能的虚拟化技术 2. docker 是什么? 能够把应用程序自动部署到容器的开源引擎 3. docker 跟原有的工具有何区别? 传统的部署模式是:安装(包管 ...
- github代码管理工具的使用方法
一.创建一个存储库 1.点击页面右上方你的用户名右边的+标志,然后点击下拉列表中的"new repository"选项,一般填写项目名称和选择public 和选择初始化有READM ...