昨天看到的朋友在qq上发的面试题,求出1+2-3+4-5+6...+100的值,早上起来就写了一下,一个是使用c函数的平方函数进行计算,一个是不适用任何函数全靠数组遍历求解,第一个需要三行代码搞定,而第二个就要很多行代码了.为什么要说这些啦.因为他牵扯到了数组的遍历.
在我们平时的开发中使用for in 或者是for 循环遍历数组,已经屡见不鲜了.
For循环
1.首先我想说,代码写的还是很漂亮的,而且代码规范也还可以.那么这样的遍历方式存在什么问题啦.
从数组遍历并没有发现什么问题.我也没有发现.那后面两个你就会明显的看到为什么会有一个allkeys和allObjects这两个数组啦.因为字典和集合比较特殊,一个是键值相对,一个数无序集合.所以遍历之前我们先要去除字典中的所有key,然后在遍历.集合是无序的所以我们不能根据下标来访问其值.那么问题来了,这两个数组的内存开销怎么办.如果我们还生活在MRC的时代,我相信你会写内存释放的语句.但是你....很烦.系统开销不要钱是怎么的.
好了既然for循环存在内存开销问题那么我们在来看系统提供的枚举遍历器的方法
枚举遍历器
这段代码看起来和for循环并没有什么不同,它的优势在于遍历所有的collection时语法都采用同一套.而且可以快速的完成反向遍历.
快速遍历(for in)
for in语法在学习和开发中已经使用的太多了,就不多展示代码了.
优点:效率和性能那都是前面的老大哥.
缺点:你可以看到我们熟悉的下标去哪了.如果我要取出某个下标的元素,这个就TMD尴尬了.
最后就来到了系统框架的终极大招.
块枚举法
很多时候我们都是采用快速遍历法来完成工作和学习.但是在Effect objective-c上,推荐我们多使用块枚举,少用for循环.
那么块枚举到底有什么独特之处呢.为什么收到作者的推崇啦.先看代码吧.
从上面我们可以明显的看到块枚举是多么的简单方便,block的参数分别是值,小标或者是key,第三个就是停止的变量值.开发者可以自定义停止遍历.
优点:1.代码简洁明了.2.可以同时获取值和下标.3.没有额外的系统开销.4可以自定义终止,可能有人说其他的通过break也可以啊.5.可以修改方法签名,避免类型转换错误.这个怎么理解啦.比如说你明确知道是一个字符串数组或字典那么在使用块枚举时可以写成这样.
使用该方法也可以执行反向遍历.就以数组举例吧.
大家有没有遇到过这样的情况.就是给定一个数组,然后让你完成换一换功能.意思就是让数组的顺序随机出现起来.解决办法有很多种.
我说一下我的解决办法,在数组资源允许使用多线程访问的情况下,我们可以直接使用块枚举的方式来进行并发遍历,了解多线程的同学肯定知道,多线程的执行完成顺序是不可控的,所以会出现,一会完成的早,一会晚的情况,在数组遍历中刚好满足换一换的需求,所以在一些资源允许多线程访问时可以使用块枚举来完成并发遍历.
好了今天的foundation框架的集合类遍历就分享到这里.虽然这些都是系统的,但是在我们常常开发中因为第三方框架的接入,导致我们不是很喜欢使用系统原生的方法.最终在学习和开发中慢慢的忘却了系统的方法到底是什么样子.可能你可以使用底层语言来实现相同的功能,但是系统永远是系统的,在效率和性能,内存等问题上都是通过深思熟虑完成的.希望我们大家在学习使用第三方框架的同时,不忘初心学习系统的知识.
如果喜欢小编,可以点击关注,我会不定期的更新一些文章,也可以关注我的专题
本人联系方式:qq:513961360
vx:扫描下方二维码:
希望能有志同道合的好友加我.聊技术.聊生活都可以.
vx
email:[email protected]
也可以加我们的qq群希望能与朋友们一起聊天和学习.群里还有很多iOS开发者,帮助我们解决问题,并且同时学习.
qq群号:580284575