OC基础 代理和协议

1.协议

(1)oc语言中得协议:一组方法列表,不需要我们自己实现,由遵守协议的类来实现协议所定制的方法。

(2)协议的使用步骤:制定协议-->遵守协议-->实现协议-->调用协议。

(3)协议声明的关键字:

(a)@required,必须实现,不实现的话在.m文件内会报警告。

(b)@optional,可选实现,不实现的话在.m文件内也不会报警告。

(4)协议和继承的区别:

(a)相同之处:都可以规范统一类中的方法。

(b)不同之处:继承的子类不需要再实现一遍父类的方法(除非有父类的方法不能够走子类的需求),子类可以继承父类的成员变量。协议之中只能有方法,不能有成员变量。

测试例子:以公司招程序员为例,公司制定的协议:必须会写代码,调bug,汇报工作。另外特别要求会唱歌。

制定两个协议,分别是Coder和Art协议:

#import <Foundation/Foundation.h>

@protocol Coder <NSObject>

//必须实现的协议
@required
- (void)code;
- (void)debug;
- (void)report; //可以选择是否实现的协议
@optional
- (void)playGame; @end
#import <Foundation/Foundation.h>

@protocol Art <NSObject>
//注意:如果不写协议关键字,默认是@required
- (void)singing; @end

公司类Company,Company.h和Company.m文件:

#import <Foundation/Foundation.h>
#import "Coder.h" @interface Company : NSObject @end
#import "Company.h"

@implementation Company

@end

员工类Staff,Staff.h文件:

#import <Foundation/Foundation.h>
#import "Company.h"
#import "Art.h"
//遵守协议:在需要实现协议的类里面的父类后面<协议名>,如果有多个,协议之间用逗号隔开。
@interface Staff : NSObject<Coder,Art> @end

Staff.h文件:

#import "Staff.h"

@implementation Staff
//实现协议
- (void)code {
NSLog(@"我会写代码");
} - (void)debug {
NSLog(@"我会调试代码");
} - (void)report {
NSLog(@"我还会汇报我的工作");
} - (void)singing {
NSLog(@"我会唱歌哦");
} @end

测试:

#import <Foundation/Foundation.h>
#import "Staff.h" int main(int argc, const char * argv[]) {
@autoreleasepool { //协议的步骤
//1,制定协议:两种方式,一个是生成协议文件,另外一个直接在制定协议的类里面写协议的代码
//2,遵守协议:在需要实现协议的类里面的父类后面<协议名>
//3,实现协议:在需要实现协议的类的.m文件里面实现协议制定的方法(记得不要在.h文件里面重新声明协议制定的方法).
//4,调用协议. Staff *staff = [[Staff alloc] init];
[staff code];
[staff debug];
[staff report];
[staff singing]; //要判断是否有playGame方法存在,存在就执行,否则不执行。
//这里playGame没有实现,所以不会执行。
if ([staff respondsToSelector:@selector(playGame)]) {
[staff playGame];
} }
return ;
}

测试结果:

2.代理

代理:A类想去做一件事,但是A类不会做或者不直接做,而是委托B类去做,A委托B做,B就是A的代理。这种模式就叫做代理。

测试例子:这是一个程序员委托朋友找女朋友的故事。

协议(也就是程序员的要求)

#import <Foundation/Foundation.h>

//制定协议
@protocol FindGirl <NSObject> - (void)isGirl;
- (void)beautiful;
- (void)gentle; @end

程序员类Programmer,Programmer.h文件:

#import <Foundation/Foundation.h>
#import "FindGirl.h" @interface Programmer : NSObject @property (nonatomic,retain) id<FindGirl>delegate; - (void)find; @end

Programmer.m文件:

#import "Programmer.h"

@implementation Programmer

- (void)find {
[self.delegate isGirl];
[self.delegate beautiful];
[self.delegate gentle];
} @end

朋友类Friend,Friend.h文件:

#import <Foundation/Foundation.h>
#import "FindGirl.h" @interface Friend : NSObject<FindGirl> @end

Friend.m文件:

#import "Friend.h"

@implementation Friend

- (void)isGirl {
NSLog(@"首先她得是个妹子");
} - (void)beautiful {
NSLog(@"其次这个妹子要漂亮");
} - (void)gentle {
NSLog(@"最后她要温柔的哦");
} @end

测试:

#import <Foundation/Foundation.h>
#import "Programmer.h"
#import "Friend.h" int main(int argc, const char * argv[]) {
@autoreleasepool { //Programmer是委托者,Friend是代理者
//代理实现的步骤
//1,定义委托者和代理者2个类
//2,制定协议
//3,代理者遵守协议和实现协议
//4,创建代理者对象和委托者对象,并且指定委托者的代理对象
//5,调用代理(在委托者里面调用) Programmer *programmer = [[Programmer alloc] init];
Friend *friend = [[Friend alloc] init]; //friend遵守programmer的协议
programmer.delegate = friend;
[programmer find]; }
return ;
}

测试结果:

这里需要注意一下,我们可以把协议写到委托者里面,这样比较简洁。上面的例子可以把FindGirl协议,写到委托者(程序员)Programmer里面。代码如下:

#import <Foundation/Foundation.h>

@protocol FindGirl <NSObject>

- (void)isGirl;
- (void)beautiful;
- (void)gentle; @end @interface Programmer : NSObject @property (nonatomic,retain) id<FindGirl>delegate; - (void)find; @end

3.循环引用

循环引用:就是多个对象之间相互引用,形成环状。

例子:People1帮People2做事,People2帮People1做事。

制定协议:People1Delegate和People2Delegate

#import <Foundation/Foundation.h>

//制定People1的协议
@protocol People1Delegate <NSObject> - (void)people1Required; @end
#import <Foundation/Foundation.h>

//制定People2的协议
@protocol People2Delegate <NSObject> - (void)people2Required; @end

People1类,People1.h文件:

#import <Foundation/Foundation.h>
#import "People1Delegate.h"
#import "People2Delegate.h" //实现协议,代表能够做某事
@interface People1 : NSObject<People2Delegate> //实现协议的对象指针,代表要求别人做某事
//注意:这里属性的修饰不能使用retain,只能使用weak或assign,如果使用retain就会造成循环引用的问题
@property (nonatomic, weak) id<People1Delegate> delegate; - (void)people1Working; @end

People1.m文件:

#import "People1.h"

@implementation People1
//People1实现People2的协议
- (void)people2Required {
NSLog(@"帮people2做事");
} - (void)people1Working {
//调用代理的方法(通知代理对象去做某事)
[self.delegate people1Required];
} @end

People2类,People2.h文件:

#import <Foundation/Foundation.h>
#import "People1Delegate.h"
#import "People2Delegate.h" @interface People2 : NSObject<People1Delegate> @property (nonatomic, weak) id<People2Delegate> delegate; - (void)people2Working; @end

People2.h文件:

#import "People2.h"

@implementation People2

- (void)people1Required {
NSLog(@"帮people1做事");
} - (void)people2Working {
[self.delegate people2Required];
} @end

测试:

#import <Foundation/Foundation.h>
#import "People1.h"
#import "People2.h" int main(int argc, const char * argv[]) {
@autoreleasepool { People1 *people1 = [[People1 alloc] init];
People2 *people2 = [[People2 alloc] init]; people1.delegate = people2;
[people1 people1Working]; people2.delegate = people1;
[people2 people2Working]; }
return ;
}

测试结果:

OC基础 代理和协议的更多相关文章

  1. OC基础8:分类和协议

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.关于分类(category): (1) ...

  2. OC基础回想(十二)协议

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

  3. 五.OC基础--1.多态,2.类对象,3.点语法,4.@property&@synthesize,5.动态类型,内省(判断对象是否遵循特定的协议,以及是否可以响应特定的消息)

    五.OC基础--1.多态, 1. 多态概念,定义:多态就是某一类事物的多种形态: 表现形式: Animal *ani = [Dog new]; 多态条件:1.有继承关系 2.有方法的重写 2.多态代码 ...

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

    OC 中的category分类文件相当于 C#中的部分类:OC 中的protocol协议文件(本质是头文件)相当于 C#中的接口.今天就简单说明一下OC中的这两个文件. 由于视频中的Xcode版本低, ...

  5. oc总结 --oc基础语法相关知识

    m是OC源文件扩展名,入口点也是main函数,第一个OC程序: #import <Foundation/Foundation.h> int main(int argc, const cha ...

  6. OC总结 【OC基础语法相关知识】

    m是OC源文件扩展名,入口点也是main函数,第一个OC程序: #import <Foundation/Foundation.h> int main(int argc, const cha ...

  7. OC基础笔记目录

    OC基础(1) Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 OC基础(2) 类与对象 类的设计 第一个OC类 对象方法的声明和实现 类方法的声明和实现 OC基础(3) 对象 ...

  8. OC基础17:归档

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.归档即是用某种格式把一个或多个对象保存 ...

  9. OC基础16:复制对象

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.浅复制即是指针赋值,复制对象的修改会影 ...

随机推荐

  1. 【回忆1314】抽奖之Flash大转盘

    1.搭建JS与Flash互通的环境 function thisMovie(movieName){ if (window.document[movieName]) { return window.doc ...

  2. Microsoft Anti-Cross Site Scripting Library V4.2 下载地址

    概述 微软反跨站脚本库V4.2(AntiXSS V4.2)是一种编码库,旨在帮助开发人员保护他们的ASP.NET基于Web的应用程序免受XSS攻击.它不同于编码库,因为它使用的白名单技术-有时也被称为 ...

  3. MySQL触发器之审计功能(转)

    [导读] 最近ITPUB技术论坛特意组织网络性讨论活动,关于数据库审计的话题,分享各自公司如何实现数据库审计.个人经验和构想,以及数据库审计的技巧,刚好有网友发了一个典型的审计需求,要帮他分析,以及教 ...

  4. RSA 加密

    iOS开发教程-iOS中的RSA加解密 在移动应用开发中常常遇到数据传输安全性的问题,尤其是在账户安全以及支付场景中的订单数据.或支付信息的传输中,正规的公司一定会要求对数据进行加密,当然有创业初期的 ...

  5. C++中基于Crt的内存泄漏检测(重载new和delete,记录在Map里)

    尽管这个概念已经让人说滥了 ,还是想简单记录一下, 以备以后查询. #ifdef _DEBUG#define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FIL ...

  6. 颠覆你的时空观-----理解傅立叶transform

    在知乎上看到的,非常不错,最起码知道为什么了: 傅立叶变换,拉普拉斯变换,z变换这三种方法的本质主要就是将信号从时域转换成频域,因为频域更好展开分析 = =. 频域只是另一种看到信号的角度(世界观). ...

  7. vector,list和deque区别

    stl提供了三个最基本的容器:vector,list,deque. vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随即存取,即[]操作符,但由 ...

  8. 切割 bitmap

    最近在安卓手机控制蓝牙打印机打印图片,有时候图片太大,考虑到bitmap的切割,在此,献上代码,各位小主指点 public class ImageSplitter { public static Ar ...

  9. codeforces 277.5 div2 F:组合计数类dp

    题目大意: 求一个 n*n的 (0,1)矩阵,每行每列都只有两个1 的方案数 且该矩阵的前m行已知 分析: 这个题跟牡丹江区域赛的D题有些类似,都是有关矩阵的行列的覆盖问题 牡丹江D是求概率,这个题是 ...

  10. M - 约会安排 - hdu 4553

    寒假来了,又到了小明和女神们约会的季节.  小明虽为�丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有很多基友找他开黑,由于数量 ...