深入解析:iOS中的代理模式应用与原理

更新:11-11 现代故事 我要投稿 纠错 投诉

什么时候应该使用协议和代理?下面举个例子谈谈我个人对代理和协议的理解,希望能作为一个切入点。假设有这样一个任务需求:A页面需要跳转到B页面(可能会传入一些参数),B页面填写或处理一些信息,跳转回A页面,同时也将数据返回给A。不要仅仅为了使用代理模式而使用代理模式。代理模式只是一种设计模式。它的价值在于解决一个原本不方便甚至几乎不可能通过统一模式解决的问题。也就是说,当原来的、简单的编程方法无法解决某个问题时,你就会想到使用一些设计模式(比如本文讨论的代理模式)。比如A页面跳转到B页面,就需要传递参数。显然可以使用代理模式来传递参数。但是这个时候有必要使用代理模式吗?我的回答是——“从不”。由于是从A页面跳转到B页面,所以代码应该如下: //AViewController.m@property (strong, nonatomic) BViewController *BVC;— (void)buttonDidClicked:(id)sender{ self.BVC=[[ BViewController分配]初始化]; [self.navigationController PushViewController:self.BVCanimated:YES];} 显然B的viewController是A的viewController的属性。由于A有一个指向B的指针,所以可以通过指针直接操作B。可以给B的属性赋值,调用B的方法等等。那么什么时候需要使用代理模式呢?我的答案是:“当B页向A页传递一个值时”。答案也是非常明显的。在页面B中,我们甚至不知道页面A存在,也就不可能给页面A传值。那么此时一个可行的解决方案就是在页面B中定义一个协议,声明一个代理对象。在A页面中,将自己设置为B页面的代理,并完成代理方法。由此不难得出结论:当一个对象无法直接获取另一个对象的指针,想要对该变量进行一些操作时,就可以使用代理模式。代理模式到底有什么作用?在我看来,代理模式只有两个焦点:协议和代理。该协议定义了一组方法,这些方法由某个类实现。代理作为某个类的属性,通常是另一个类的实例对象。它可以负责完成原类不方便或不可能完成的任务。首先我们来说说代理,回顾一下我们脑海中代理模式的实现过程。在页面B中定义代理对象时,看起来和定义普通属性非常相似(除了weak和id 《delegate》)。这也是我对代理的总结:代理只是一个属性,并没有什么神秘之处。当然,agent不仅仅是一个普通的属性,否则我只需要重写B的初始化方法就可以达到同样的效果:self.BVC=[[BViewController alloc]initWithDelegate:self];然后在BViewController.m 中定义一个AViewController *AVC 并在初始化方法中赋值。请注意,定义代理时,格式通常如下所示:iddelegate;

所以我对代理商优势的理解是:

代理的核心优势是解耦

与直接声明属于固定类的代理相比,声明为id 的代理有两个明星优势。

允许多个不同的类成为该类的代理。试想一下,在本文的例子中,如果B页面可以跳回N页,如果它仍然声明一个公共对象怎么办?

允许委托的类尚未确定。试想一下,UITableView也有一个委托,它不知道哪个类将成为它的委托。

再看一下协议。协议比较简单。协议只是定义了一组方法。代理模式下,B页面不需要定义协议,A页面就遵循这个协议。直接调用A的方法就可以了。

我个人认为该协议的优点在于以下几点:

您可以利用Xcode 的检查机制。对于定义为@required的方法,如果实现了协议但方法没有实现,编译器会发出警告。这可以防止你因为疏忽而忘记实现某段代码。由于OC的运行时特性,此类错误往往会导致程序在运行阶段崩溃。

有利于代码封装。如果一个类实现了某种协议,那么定义该协议的类就可以调用该协议中的方法,而无需在.h中声明。这减少了类向外界公开的方法的数量。

它有利于程序的结构化和层次结构。协议通常是解决问题的方法。对于另一个类似的问题,我们只需要再次实现协议即可,避免了再次构思一套方法。该协议的继承机制使其更加强大。

用户评论

喜欢梅西

学习一下 iOS 的代理模式,听说是提高代码复用率的好方法。

    有11位网友表示赞同!

▼遗忘那段似水年华

最近在开发中遇到一些回调的问题,代理模式好像是个解决方法。

    有17位网友表示赞同!

厌归人

之前还不太了解什么"双重引用"和 "委派责任" 这些概念,标题看来要学习新知识了。

    有9位网友表示赞同!

微信名字

我一直觉得 iOS 开发的东西有时候有点太复杂了,代理模式又是啥东西呢?

    有19位网友表示赞同!

余温散尽ぺ

这篇文章内容会不会比较深入呢?我想要了解代理模式的基本原理,然后具体案例的应用。

    有12位网友表示赞同!

摩天轮的依恋

iOS 代理模式应该在 App 的界面设计和交互方面很有作用吧?

    有5位网友表示赞同!

熟悉看不清

感觉最近 iOS 开发越来越像是一门新的语言了,各种概念都需要去学习。

    有10位网友表示赞同!

余笙南吟

期待这篇文章能给我一些代理模式实际应用的案例,让我更容易理解。

    有16位网友表示赞同!

有一种中毒叫上瘾成咆哮i

看标题感觉像是要讲解代理模式的设计思想和实现方式,应该很实用。

    有10位网友表示赞同!

抚笙

我已经知道一些 iOS 的基本框架了,还想深入了解一些核心设计模式,比如代理模式。

    有13位网友表示赞同!

哭着哭着就萌了°

学习完这篇文章后,希望我可以自己写出更简洁、更高效的 iOS 代码!

    有8位网友表示赞同!

男神大妈

感觉代理模式这种设计模式应该是很多应用程序都会用到吧?

    有5位网友表示赞同!

巷雨优美回忆

之前在做项目的时候遇到的问题,现在回头来看可能可以用代理模式来解决啊!

    有18位网友表示赞同!

太难

希望能理解明白iOS代理模式的优缺点,以便选择合适的设计方案。

    有9位网友表示赞同!

tina

看完这篇文章后,我觉得应该能写出更巧妙的 iOS 代码了!

    有9位网友表示赞同!

妄灸

之前没接触过代理模式,现在开始学习这个概念,希望能够快速掌握。

    有8位网友表示赞同!

放肆丶小侽人

标题很吸引人,我一直在想如何提高自己 iOS 开发水平。

    有8位网友表示赞同!

凝残月

感觉代理模式应该是一种比较流行的设计模式吧?

    有17位网友表示赞同!

陌潇潇

iOS 平台有很多不同的开发方式,学习代理模式能使代码结构更清晰!

    有12位网友表示赞同!

颜洛殇

这篇文章能不能给我一些实际案例分析呢?更容易理解。

    有15位网友表示赞同!

【深入解析:iOS中的代理模式应用与原理】相关文章:

1.动物故事精选:寓教于乐的儿童故事宝库

2.《寓教于乐:精选动物故事助力儿童成长》

3.探索动物旅行的奇幻冒险:专为儿童打造的童话故事

4.《趣味动物刷牙小故事》

5.探索坚韧之旅:小蜗牛的勇敢冒险

6.传统风味烤小猪,美食探索之旅

7.探索奇幻故事:大熊的精彩篇章

8.狮子与猫咪的奇妙邂逅:一场跨界的友谊故事

9.揭秘情感的力量:如何影响我们的生活与决策

10.跨越两岸:探索彼此的独特世界

上一篇:第189天高效慢生活实践:08月20日心得分享 下一篇:高效过滤链管理策略与最佳实践