鉴于Objective-C是不支持多继承的,所以需要用协议来代替实现其他类的方法,所以有了代理设计模式。

代理,又称委托,delegation。

代理模式可以让一个单继承的类实现父类以外其他类的方法。代理也可以用于传值。

我们先来说说原理,最后再看看是如何传值的。

如图选取Objective-C File并选择Protocol创建文件后在该协议文件中写入方法。

myProtocol.h

@protocol myDelegation <NSObject>

-(void)method1;

-(void)method2;

@end

创建另一个类用于实现myProtocol.h中的方法

myDelegate.h

#import <Foundation/Foundation.h>

#import "myProtocol.h"

@interface myDelegate : NSObject<myProtocol>

{

id<myProtocol>obj;

}

-(void)method3;

-(instancetype)initWithObj:(id<myProtocol>)obj;

@end

myDelegate.m

#import "myDelegate.h"

@implementation myDelegate

-(instancetype)initWithObj:(id<myProtocol>)o{

self=[super init];

if(self){

obj=o;

}

return self;

}

-(void)method1{

[obj method1];

}

-(void)method2{

[obj method2];

}

-(void)method3{

NSLog(@"自身的方法。。。");

}

@end

创建一个实现方法的类

helper.h

#import <Foundation/Foundation.h>

#import "myProtocol.h"

@interface helper : NSObject<myProtocol>

@end

helper.m

#import "helper.h"

@implementation helper

-(void)method1{

NSLog(@"helper做method1。。。");

}

-(void)method2{

NSLog(@"helper做method2。。。");

}

@end

代理实现:

#import <Foundation/Foundation.h>

#import "myProtocol.h"

#import "myDelegate.h"

#import "helper.h"

int main(int argc, const char * argv[]) {

@autoreleasepool {

helper *h=[[helper alloc]init];

myDelegate *delegate=[[myDelegate alloc]initWithObj:h];

  [delegate method1];

[delegate method2];

      [delegate method3];

}

return 0;

}

运行结果:

helper做method1。。。

helper做method2。。。

自身的方法。。。

以上就是代理的原理,接下来我们看看代理是如何传值的。

代理传值有通过类与类之间,还有通过控制器(Controller)与控制器(Controller)之间的传值。我以控制器之间传值为例展示一下代理传值。

首先创建一个Protocol文件

sendDataDelegate.h

#import <Foundation/Foundation.h>

@protocol sendDataDelegate <NSObject>

-(void)sendData:(NSString*)str;

@end

然后创建第二个视图控制器类,并在main.storyborad中拖拽另一个视图控制器并将类与视图匹配。添加button到系统给的视图控制器并以modal的方式连接到第二个视图控制器,如图:

ViewController.h

#import <UIKit/UIKit.h>

#import "sendDataDelegate.h"

@interface ViewController : UIViewController<sendDataDelegate>

@end

ViewController.m

#import "ViewController.h"

#import "secondViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UITextField *myTextField;//从故事版中拖拽进来

@property(nonatomic,strong)NSString *temp;

@end

@implementation ViewController

//记得给故事版中go button拖拽的segue的identifier属性命名gotosecond

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

if ([segue.identifier isEqualToString:@"gotosecond"]) {

secondViewController *svc=(secondViewController*)segue.destinationViewController;

svc.delegate=self;

}

}

- (void)viewDidLoad {

[super viewDidLoad];

}

-(void)sendData:(NSString *)str{

self.temp =str;

self.myTextField.text=self.temp;

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

}

@end

secondViewController.h

#import <UIKit/UIKit.h>

#import "sendDataDelegate.h"

@interface secondViewController : UIViewController

@property(nonatomic,weak)id<sendDataDelegate>delegate;

@end

secondViewController.m

#import "secondViewController.h"

#import "ViewController.h"

@interface secondViewController ()

@property (weak, nonatomic) IBOutlet UITextField *myTextField;

@end

@implementation secondViewController

- (IBAction)back:(id)sender {

[self.delegate sendData:self.myTextField.text];

[self dismissViewControllerAnimated:YES completion:nil];

}

- (void)viewDidLoad {

[super viewDidLoad];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

}

@end

效果图演示

当一个视图控制器需要另一个视图控制器更新UI或者做其他事情的时候,我们可以通过代理传值的方法来实现。

IOS之Objective-C学习 代理设计模式的更多相关文章

  1. 你真的了解iOS代理设计模式吗?

    在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递一些参数.这篇文章会涵盖代理的使用技巧和原理,以及代理的内存管理等方面的知识.我会通过这些方面的知识,带大 ...

  2. 【转】你真的了解iOS代理设计模式吗?

    转自:http://www.cocoachina.com/ios/20160317/15696.html 在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递 ...

  3. 「补课」进行时:设计模式(5)——从 LOL 中学习代理模式

    1. 前文汇总 「补课」进行时:设计模式系列 2. 从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔 ...

  4. ios代理设计模式

    代理设计模式的作用:     1.A对象监听B对象的一些行为,A成为B的代理     2.B对象想告诉A对象一些事情,A成为B的代理   代理设计模式的总结:     如果你想监听别人的一些行为,那么 ...

  5. OC学习——OC中的@protocol(@required、@optional)、代理设计模式

    一.什么是协议? 1.协议声明了可以被任何类实现的方法   2.协议不是类,它是定义了一个其他对象可以实现的接口   3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议.   4.协 ...

  6. IOS开发-OC学习-常用功能代码片段整理

    IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是 ...

  7. Objective-C之代理设计模式小实例

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  8. ios和android一并学习的体会

    如果说为什么要同时学习这两种不同的移动平台,其实有一定的“闲”的因素在里面. 相对于ios,android我是早半年接触的.最开始学习的时候也就是j2ee学习的延续,通过看视频连带看书学了大概一个月的 ...

  9. [学习笔记]设计模式之Builder

    写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 作为一个新入职的魔导士呢,哦不,是程序员,我以为并没有太多机会去设计项目的软件架构.但是,工作一段时间之后,自己渐渐意识到,哪怕是自己 ...

随机推荐

  1. 搞了我一下午竟然是web.config少写了一个点

    Safari手机版居然有个这么愚蠢的bug,浪费了我整个下午,使尽浑身解数,国内国外网站搜索解决方案,每一行代码读了又想想了又读如此不知道多少遍,想破脑袋也想不通到底哪里出了问题,结果竟然是web.c ...

  2. 这些年一直记不住的 Java I/O

    参考资料 该文中的内容来源于 Oracle 的官方文档.Oracle 在 Java 方面的文档是非常完善的.对 Java 8 感兴趣的朋友,可以从这个总入口 Java SE 8 Documentati ...

  3. Android,适合Restful网络请求封装

    借助volley.Gson类库. 优点 网络请求集中处理,返回值直接为预期的对象,不需要手动反序列,提高效率,使用时建立好model类即可. 使用效果 DataProess.Request(true, ...

  4. Azure 部署 Asp.NET Core Web App

    在云计算大行其道的时代,当你在部署一个网站时,第一选择肯定是各式各样的云端服务.那么究竟使用什么样的云端服务才能够以最快捷的方式部署一个 ASP.NET Core 的网站呢?Azure 的 Web A ...

  5. Java在DOS命令下的运行及其API文档制作过程

    该文档主要描述java程序在DOS命令下的运行,以及一些常用的命令 常用DOS命令: d: 回车 盘符切换 dir(directory):列出当前目录下的文件以及文件夹 md (make direct ...

  6. 设置Fn键 笔记本直接按F1-F12 无须按Fn键 Fn+F12改F12(联想小新300为例)

    最近公司给配的笔记本联想小新300 80RT  i7-6500U 4G内存 500G机械,后加装120G固态+4G内存 这样就感觉还不错了. 在使用这本子的时候,去了Win10,强行装了Win7.无线 ...

  7. C# BS消息推送 负载均衡-SignalR&Redis的配置(三)

    1. 前言 本文是根据网上前人的总结得出的. 环境: SignalR2.x,VS2015,Win10 2. 负载均衡配置 配置很简单,只要在startup类中添加Redis的连接就OK. 1)首先,引 ...

  8. 小知识:C#可选参数的一个陷阱

    一.背景: 互联网行业,为了降低程序维护.升级的部署风险,往往会将程序拆分成很多项目,编译成多个dll部署,这样发布的时候,只需要部署修改过的dll即可.   二.问题: 有一个函数,在很多个地方被使 ...

  9. Redis数据结构详解之Set(三)

    序言 在Redis中,Set和list都是字符串序列,非常相似,不同之处在于Set是用哈希表来保持字符串的唯一性,没有先后顺序,不像list一样,可以在首尾增删数据.但是set也有自己的相应处理命令来 ...

  10. 在ASP.NET中基于Owin OAuth使用Client Credentials Grant授权发放Token

    OAuth真是一个复杂的东东,即使你把OAuth规范倒背如流,在具体实现时也会无从下手.因此,Microsoft.Owin.Security.OAuth应运而生(它的实现代码在Katana项目中),帮 ...