iOS 创建对象的姿势

在写 iOS 代码的时候,怎么样去 new 一个新对象出来,都有一些讲究在里面。使用不同的姿势去创建对象,对后期维护所造成的影响会存在细微的差别。 init 创建 在之前一篇分析 iOS 代码耦合的文章中,提到过当我们给一个对象的 property 赋值的时候,通过 init 方法传入参数来初始化 property 会让我们的代码更可靠。 有些人在定义带 property 的 clas...

iOS代码设计中的开放与封闭

我们至今所写的 iOS 代码都是遵循 OOP 这种编程范式,以对象来临摹和表达我们对于世界的理解。在设计类的时候,恪守 SOLID 五个原则会让我们的代码更易拓展和维护。SOLID 中的 O 代表的是 Open/closed principle,这篇文章所要探讨的不仅仅是类设计中的 Open 和 Closed,而是要站在更广阔的视角来看待代码中的开放与封闭。 前言 我们作为代码工作者,不...

一名iOS程序员眼中的「小程序」

小程序如约和大家见面了,就这两天的势头来看,可以说是「好评如潮」了。Peak君今天也和大家闲聊下,这小程序和我们iOS程序员之间的关联。 初步观感 初体验非常棒,试用几个小程序之后,感觉在流畅度和响应时间上都属上乘,整体水准非常接近Native的体验,客户端团队应该下了不少功夫,Peak君已经听到了身边好几个朋友的溢美之词了。 小程序的入口现在位于第三个Tab页,单从这一入口深浅来说,...

危险的UITableView

如果把我们所做的UI做个简单分类,大致上可以分为列表界面和非列表界面。对于列表类UI,我们可以选择UITableView或者UICollectionView来实现。UICollectionView出现之前,UITableView几乎是唯一的选择,这每日可见人人都用的UITableView里隐藏着容易忽视的危险。 同步VS异步 同步和异步是基础的编程概念,也是贯穿于我们日常的两种代码书写方...

iOS当中的Cache设计

Cache的设计是个基础计算机理论,也是程序员的重要基本功之一。Cache几乎无处不在,CPU的L1 L2 Cache,iOS系统的clean page和dirty page机制,HTTP的tag机制等,这些背后都是Cache设计思想的应用。 为什么需要Cache Cache的目的是为了追求更高的速度体验,Cache的源头是两种数据读取方式在成本和性能上的差异。 在开始着手设计Cach...

2016年写文章总结

今天是2016年最后一个工作日,给自己做篇写文章的总结,同时也把过去一年的文章分门别类下,方便大家阅读。 年初的时候,定了两个小目标: GitHub上赚1000颗星星 坚持写技术博客 现在看来,总算没以工作忙为借口,把这两个都给实现了,尤其是写博客,最后的结果甚至超过原本的计划(庆幸脸)。 先晒下我收集的星星: 之所以要在GitHub齐集1000颗星星,纯粹是出于那...

如何用Xcode8解决多线程问题

Xcode 8诞生有段时日了,不知道大家对其中的新Feature是否都学习过一遍了,今天给大家介绍下Xcode 8中一个很实用的特性,Thread Sanitizer,用来解决平时编写代码时难以调试的多线程问题,顺道梳理下一些常见的容易混淆的多线程概念。 Thread Sanitizer 这款工具集成在Xcode 8中,主要帮助定位多线程相关的问题,还没有了解过的同学可以先查看 WWDC...

iOS代码耦合的处理

耦合是每个程序员都必须面对的话题,也是容易被忽视的存在,怎么处理耦合关系到我们最后的代码质量。今天Peak君和大家聊聊耦合这个基本功话题,一起捋一捋iOS代码中处理耦合的种种方式及差异。 简化场景 耦合的话题可大可小,但原理都是相通的。为了方便讨论,我们先将场景进行抽象和简化,只讨论两个类之间的耦合。 假设我们有个类Person,需要喝水,根据职责划分,我们需要另一个类Cup来完成喝水...

从Swift看Objective-C的数组使用

状态维护是个怎么说都不够的话题,毕竟状态的处理是我们整个App最核心的部分,也是最容易出bug的地方。之前写过一篇以函数式编程的角度看状态维护的文章,这次从Swift语言层面的改进,看看Objective C下该如何合理的处理数组的维护。 Objective C数组的内存布局 要了解NSArray,NSSet,NSDictionary这些集合类的使用方法,我们需要先弄明白其对应的内存布局...

2016年iOS技术圈回顾

2016年同2015年一样,在我还没有做好心理准备的时候,一晃神就到了年底。年关将近,不知诸君心情如何,年初的规划实现了多少,来年的计划又是否已有了眉目。年过三十的Peak君感觉年关是越来越难过了,越喧嚣的时候越想静处,感慨越多能说出口的反而越少。 近来有读者问Peak君为何最近这么多产,原因无他,仅为缓解年关将近的焦虑感。今年要说有什么收获,该算发现坚持写字所带来的好处。最近感觉尤其明显...

iOS关于时间的处理

做App避免不了要和时间打交道,关于时间的处理,里面有不少门道,远不是一行API调用,获取当前系统时间这么简单。我们需要了解与时间相关的各种API之间的差别,再因场景而异去设计相应的机制。 时间的形式 在开始深入讨论之前,我们需要确信一个前提:时间是线性的。即任意一个时刻,这个地球上只有一个绝对时间值存在,只不过因为时区或者文化的差异,处于同一时空的我们对同一时间的表述或者理解不同。这个...

扒一扒HTTP的构成

HTTP全称为HyperText Transfer Protocol,从名字不难看出这是一种基于文本的网络协议,对于初学者来说比较友好,容易上手。各平台上的一些第三方库都对HTTP做了进一步的封装,让HTTP变得更加亲民,但往往拿来就用的技术,很容易忽视其背后隐藏的细节。今天一起来扒一扒HTTP到底是如何构成的。 初窥全貌 HTTP第一眼看上去非常简单,先来看看Request部分: ...

iOS与函数式编程

有时候,一个关键字就是一扇通往新世界的大门。两年前,身边开始有人讨论函数式编程,拿关键字Functional Programming一搜,全是新鲜的概念和知识,顺藤摸瓜,看到的技术文章和框架也越来越多。 我有个习惯,在接收新知识的时候,我都会用已有的知识去做对比,我更关注新事物能对现有产品和知识体系带来哪些好处。 计算机发展到今天,已经很久很久没有理论层面的升级了,现今绝大部分新的知识都...

开车啦!一键爬知乎各种爆照

这是一篇严肃的技术分享文章,旨在向大家介绍一些网络安全方面的知识,及相关工具的使用。闲话少说,直接进入正题。 实现目标 知乎上经常有各种爆照及钓鱼贴,类似「胸大是一种什么样的体验?」, 「女生有翘臀是什么样的体验?」等。其实大家关心的只有照片,是不是? 我们的目标是在终端输入: ./get.sh 胸大 就能从知乎将胸大(或者其他关键词)相关的话题回答中的图片,一键下载到本地的文...

正确使用多线程同步锁@synchronized()

在上篇多线程安全的文章中,我曾推荐过大家使用@synchronized来使得代码获得原子性,从而保证多线程安全。这篇文章向大家介绍一些@synchronized的知识点和应该避免的坑。 @synchronized原理 @synchronized是几种iOS多线程同步机制中最慢的一个,同时也是最方便的一个。 苹果建立@synchronized的初衷就是方便开发者快速的实现代码同步,语法如...

iOS多线程到底不安全在哪里?

iOS多线程安全的概念在很多地方都会遇到,为什么不安全,不安全又该怎么去定义,其实是个值得深究的话题。 共享状态,多线程共同访问某个对象的property,在iOS编程里是很普遍的使用场景,我们就从Property的多线程安全说起。 Property 当我们讨论property多线程安全的时候,很多人都知道给property加上atomic attribute之后,可以一定程度的保障多...

如何深度重构UIViewController实例-直播界面

之前写过一篇深度重构UIViewController,中间简单的提到过我现阶段是如何重构Controller这一层的。之后不少同学联系我索要demo代码,果然是no code, no BB。 抽空把之前做过的一个直播App Controller这一层抽离出了一个简单的demo,把关键的和业务相关的代码全部去掉了,剩下一个列表和直播界面,但能从中看出完整的流程。 重构思路 重构的思路在之...

和Charles同样强大的iOS免费抓包工具mitmproxy

现阶段给iOS设备进行网络抓包的手段非常之多,除了我之前介绍的tcpdump,wireshark之外,还有Charles,以及和Charles同样好用的mitmproxy,其实还有更多,比如更小众的debookee。似乎知道Charles的同学更多一些,但其实Charles有的功能mitmproxy基本都有,mitmproxy还免费,而且对于terminal用户来说使用起来更亲近。 如何使...

Wireshark抓包iOS入门教程

网络抓包是个基础技能,对于网络协议的掌握有一定的要求。iOS上实现网络抓包可以用Charles(针对http和https),tcpdump(快速分析网络包),和Wireshare。之前写过一篇介绍tcpdump抓包的入门文章,和tcpdump相比,Wireshark提供丰富的GUI交互,而且能分析所有的网络协议,关键还是免费的,掌握好Wireshark就能应付绝大部分需要分析网络协议的场景了...

Http文件上传进度为什么不准

做过客户端文件上传的同学会明白,基于HTTP的文件上传并没有看起来那么简单。按我过去经验,至少有两块工作会比看上去要麻烦一些,第一个是断点续传,第二个是进度展示。断点续传想要优化的好要花不少力气,后面有机会再写,这篇先看上传进度的问题。 首先说现象:我们调用第三方http framework上传文件的时候,都会有API回调告诉我们上传的具体进度,这个进度值都是不准的。 比如下面代码使用a...