最近项目完成的差不多了,闲下来的时间突然心血来潮想自己写写以前没用过的方法。这里就包含了几种常见的反向传值的方法。
之所以现在专门自己写反向传值的博文记录,是因为之前几乎没怎么用到这些反向传值的方法,那么这里将会描述一下像“代理”、“block”、“通知”、“单例”这四种传值方法。
首先是代理,也就是常看到的delegate。说的通俗点,就是委托一个对象,让其帮忙处理事情,说到底就是个中介的标志。详细方案如下:
在父类中调用其代理并传递参数
自定义代理的写法
最后在代理中实现代理方法
看得出来,只需要三步就可以完成一个代理的设置以及调用,既简单又方便,难怪会成为开发人员最钟爱的传值方法。再来是block的传值,可以说这个的地位跟代理是不相伯仲的,来看看它的写法:
首先根据需要自定义一个block(参数自己决定,这里用耽搁字符串举例),设置为类的一个属性
然后在需要的地方把参数传进去
最后直接在需要的地方调用这个block,取出其中的数据即可
没错,利用block进行传值一样只需要三步就能完成,同样既简洁又方便,而且省去设置代理和协议的设置,直接把自己作为代理对象,可谓简单粗暴,这也是为什么block这个写法看上去有点怪异的东西这么受开发者种爱的原因了。
接下来是通知传值,这个是敝人经常用到的传值方法,说起来有点low,没办法,自己之前对其他的一些方法没花时间琢磨,而通知传值在我看来比较“方便”,所以一直沿用到现在。方法也不是很复杂:
注册一个观察者用于接受到通知后调用回调方法
在需要的方法发送包含数据的通知(可以是字典,这里直接用单一个字符串举例)
最后响应通知回调方法即可
仍然只需要三步,仍然非常简洁方便,跟代理类似,注册观察者即为设置代理,通知回调即为代理方法,只是传递的参数类型统一为(NSNotification *),处理起来可能要麻烦几步。 这里要注意的是,只有预先注册了观察者的地方,才会在发送完通知后启用回调方法,而且每个通知的回调也只有一次。就像广播,只播送一次,听到的人才会有反馈。看上去很美好,实际上是用起来比较麻烦,因为你要自己在需要的地方把数据存储到相应的通知中,当数据量大的时候一般会选用字典来存储,会比较麻烦,回调的方法也需要自己来写,所以在开放过程中用到的几率不是很高,当然的,还是要清楚用法哟。
最后是单例传值,我记得当初教我的老师就提到过这是他最喜欢用的一种传值方法。同样贴上使用步骤:
.h文件中的写法
.m文件中实现单例的创建方法,把需要初始化的属性记得初始化一下
引入单例,保存数据到单例对象的属性中
最后在需要用到地方拿出单例对象,取出它的属性进行使用即可
满打满算也差不多是三步,这么看基本上这几种方法好像步骤都很简单啊~老实说我看着也是简单,但是实际上你得想清楚,在使用单例传值时,你不得不单独的去创建.h和.m文件,而这个单例可能只用到某一个地方,那一般的项目中需要反向传值的地方是很多的,如果每个地方都用单例,就有可能会要创建很多的单例对象的文件,想想也是麻烦,因为不能像代理和block那样直接写到对应的类里面,总归来说还是比较麻烦的,所以这种方法也是看到的比较少。
以上提到的四种传值方法并不只是针对反向的,而是反向传值中常用的,像没有提到的偏好设置等也是可以用来传值的,这里就不说了。总结来说,几种方法都是不错的,各有各的受众面,一般来说,在对象不多的文件里推荐用单例即可实现各文件的无障碍传值,而相对的传值频繁而且对象复杂的文件里则推荐代理和block,至于通知的话并没有比前2种更好,由你自己取舍啰~
本文出自 “11562149” 博客,请务必保留此出处http://11572149.blog.51cto.com/11562149/1782121
原文地址:http://11572149.blog.51cto.com/11562149/1782121