深度重构UIViewController

UIViewController是iOS应用的基础业务单位,每个iOS程序员都写过无数的Controller。今天和大家一起来深度解剖Controller,看看怎么来做一次深度的重构。 重构的前提 我们应该谨慎的去重构我们的代码。iOS系统提供的UIViewController一定程度上可以很好的应付简单的页面单位,对于复杂的页面,我们也可以采用市面上主流的MV(X)系列模式,比如MVP...

一款Xcode合法插件EasyCode,快速生成代码

一直想着要做个新插件提升Xcode下写代码的效率,之前的FastStub虽然能省去很多方法的生成,但还是有不少“体力劳动”型代码要敲,这些天趁着空了一些新写了一款Xcode“合法”插件,之所以说合法,是因为Xcode 8开始禁用了之前所有的第三方插件,新开发的插件要通过安全性检验,必须使用官方的Xcode Editor Extension来做。这款EasyCode插件就是基于Extensio...

一次iOS App优化(踩坑)之旅

未经深思熟虑的优化是bug之源,这句话做过深度优化的同学一定能明白其中的辛酸。今天和大家分享下博主一次优化CoreText的填坑经历。记得那时候,iPhone 4s还算市面上的主流机型。 优化起因 当时正在做一款IM App,产品经理觉得每次第一次进入聊天界面的时候有点慢,而且进入之后的第一次滑动有点卡。正是由于慢和卡,导致了后面一系列的优化。在开始介绍优化方案之前,先说下「首次体验问题...

iOS网络请求在Controller退出后是否应该被取消?

一个编写iOS代码的经典场景:用户进入某个Controller,发起Http网络请求从Server获取数据,在数据返回之前用户退出了Controller。此时是否需要Cancel之前发出的网络请求呢? 如果请求的数据只在当前Controller产生内容,结论当然是需要Cancel,虽然我知道不少iOS程序员因为偷懒而忘了取消。我们用工程的思维,深入本质,一起看下这背后都发生了什么,如果不C...

深度优化iOS网络模块

几乎每一个讲究的iOS项目都会有一个「网络模块」,大部分的网络请求都是通过HTTP完成,使用成熟的第三方库诸如AFNetworking很容易搭建一个功能简易的网络模块。但这一模块要优化好却没那么简单,是个旷日持久的工作,笔者根据自己多年的“填坑”经验,总结一下深度优化iOS项目网络模块的方方面面,也给自己做下知识梳理。 预热 网络模块的接口设计不在本文讨论之列,设计思路有些偏个人口味,我...

iOS应用架构现状分析

iOS从2007年诞生至今已有近10年的历史,10年的时间对iOS技术圈来说足够产生相当可观的沉淀,尤其这几年的技术分享氛围无论国内国外都显得异常活跃。本文就iOS架构这一主题,结合开发圈里讨论较多的几种主流方式,再配以博主自己的理解,做下现状分析。给自己做下知识梳理的同时,也期望能引入新的思考。 架构的定义 过去6年多几乎绝大部分时间都浸淫在iOS平台,翻阅过不少关于架构的文章,发现众...

iOS应用UI线程卡顿监控

iOS设备虽然在硬件和软件层面一直在优化,但还是有不少坑会导致UI线程的卡顿。对于程序员来说,除了增加自身知识储备和养成良好的编程习惯之外,如果能一套机制能自动预报“卡顿”并检测出导致该“卡顿”的代码位置自然更好。本文就可能的实现方案做一些探讨和分析。先贴出最后方案的github地址。 解决方案分析 简单来说,主线程为了达到接近60fps的绘制效率,不能在UI线程有单个超过(1/60s≈...

一份"有点难"的iOS面试题

之前一时兴致在知乎上出过一份iOS的中级面试题,引起一些关注,不少同学表示对”隐藏关卡“感兴趣。升级版iOS面试题来了,目测难倒90%iOS程序员,目测一大波程序员撸着袖子在靠近。每道题都不难,对知识广度有要求,请摸着良心回答,不要百度。 声明:这份面试题和iOS程序员本身技术水平没任何关联,无论你能否全部答出,都不要对自己产生任何正面或消极的评价,权当做闲暇之余的消遣。 1.NSStr...

一个让脑子快速进入编程状态的小Tip

写代码是门耗费脑力的手艺活。普通人一天约有40%的身体能量被大脑消耗,作为大脑的重度使用者,程序员每天对大脑的使用率可想而知。 特别是像我这样的高龄程序员,如果昨晚熬夜加过班,第二天一大早很容易脑子昏昏沉沉。 有很多大众鸡汤可以帮助Refresh Brain。比如:保持充足的睡眠,每天一杯咖啡,使用GTD,番茄工作类app,听听轻音乐等等。 今天给大家介绍一款适合程序员的小Tip。 ...

iOS组件化方案

最近在思考团队扩张及项目数量增加的情况下,如何持续保障团队高效产出的问题,很自然的想到了组件化这个话题。重翻了前段时间iOS开发圈关于组件化的讨论,这里做下梳理和自己的思考。 组件化的驱动力 在开始讨论组件化技术方案之前,可以先思考下驱动项目组件化背后的原动力。我们假设这样一个场景,公司有 A,B,C三个项目在appstore运作,三个项目分别由Team A,Team B,Team C开...

书写高质量代码之状态维护

维护程序状态的一些小心得。 状态之始 我们第一眼接触新事物所触发的思考方式,决定了以后我们看待这样事物的角度,进而影响更深层次的理解和行为。 编程相对于人类历史的进程而言,不过是个六七岁孩童偶然捡到的新玩具,因为新鲜好玩到现在都还爱不释手。这个玩具于我们的大脑会产生怎么样的化学反应是个未知数,每个个体都不同。你第一眼见到色彩或形状直接关系到你的兴趣点或是以后会怎样去把玩这个玩具。 小...

iOS内存泄漏自动检测工具PLeakSniffer

新款objective-C内存泄漏自动检测工具PLeakSniffer,GitHub地址。 背景 前些天读到WeRead团队分享的一款内存泄漏检测工具MLeaksFinder,恍惚想起早些时候自己也有过编写这样一个小工具的想法,不知道由于什么原因把这事给忘记了。在仔细读过MLeaksFinder源码,了解实现思路之后,发现和自己最初的想法并不相同,终于在上个周末战胜拖延症将之前的想法付诸...

纯IPv6环境App适配的坑

苹果从2016年6月1号开始,强制所有app必须支持纯IPv6的网络环境。这项举措将对IPv6的普及起到一定的推动作用,也体现了Apple作为国际大厂的担当。 大部分App由于使用的是高层API,并不需要做任何的更改就能自然度过这次IPv6的考核,只是对于少部分手写IPv4地址连server的同学,生活有一点点影响。 请好好学习TCP/IP协议 每次苹果对技术的推动,都是一次很好的充电...

高效使用Xcode(10分钟视频教程)

简单高效的小技巧,帮助提升Xcode使用效率。 代码浏览 快速启动Xcode 项目之间切换 cmd+~ .h和.m之间切换 ctrl+cmd+ ↑ or ↓ 定位类文件 cmd+shift+J 类文件查找 cmd+shift+O 方法调用者查看 ctrl+1 类结构预览 ctrl+2 代码生成 常用代码快捷方式 导入头文件 ctrl+cmd...

一只快速生成代码的Xcode插件FastStub

插件github地址,这款插件的灵感来源于Android Studio,在AS当中按 cmd+N 可以呼出generate code菜单,快速生成一系列模板代码。比如自动解析出super class当中还没有被override的方法,比如自动生成Constructor,并选择要传入的参数等。 插件原型 在Android Studio中可以这样重载父类的方法。 支持多选,按回车一键插...

Mac下提升工作效率的方式

Mac系统一向以提供高效的工作环境著称,iOS,Android和server端程序员都可以轻松的在Mac上搭建舒适的开发环境。笔者主要从事iOS开发,一般在macbook上工作,以下是这些年累积下来的一些提升工作效率的方式,和大家分享。 熟记快捷键 快捷键对提升效率的帮助最大,但初期掌握曲线也比较陡。熟记一些常用快捷键之后,能感受到立竿见影的效果。比较实用的有: cmd+c, cmd+...

魔法数字“3”

作为24k高纯度理工技术男,从大量和女性朋友交流的经历中,我发现一个有意思的现象:男性在聊天的时候,一般会习惯就某一个话题持续深入的探讨,而女性总是在无意识当中频繁的切换话题。如果将话题的切换比作线程的context switch,男人的并发执行能力和女人相比,简直弱爆了。在经历无数的挫败之后,我也终于发现了和女性朋友愉快聊天的关键法则:不要尝试去记住10分钟之前的聊天内容。 男人的大脑虽...

Android线程的正确使用姿势

线程是程序员进阶的一道重要门槛。对于移动开发者来说,“将耗时的任务放到子线程去执行,以保证UI线程的流畅性”是线程编程的第一金科玉律,但这条铁则往往也是UI线程不怎么流畅的主因。我们在督促自己更多的使用线程的同时,还需要时刻提醒自己怎么避免线程失控。除了了解各类开线程的API之外,更需要理解线程本身到底是个什么样的存在,并行是否真的高效?系统是怎么样去调度线程的?开线程的方式那么多,什么样的...

App安全之网络传输安全

移动端App安全如果按CS结构来划分的话,主要涉及客户端本身数据安全,Client到Server网络传输的安全,客户端本身安全又包括代码安全和数据存储安全。所以当我们谈论App安全问题的时候一般来说在以下三类范畴当中。 App代码安全,包括代码混淆,加密或者app加壳。 App数据存储安全,主要指在磁盘做数据持久化的时候所做的加密。 App网络传输安全,指对数据从客户端传输到...

搭建数据驱动型Android架构

之前的文章里介绍了如何搭建iOS平台下的数据驱动型架构,iOS和Android系统在平台特性和应用场景下其实有很高的相似性,在不少架构的整体实现思路上基本都一致,只是由于语言特性的差异在实现方式上会有些不同而已。简而言之,内功心法一致,变的只是招式。这里我们用相同的思路来搭建Android系统平台下的DDA(Data Driven Architecture)架构。附GitHub Demo地址...