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...

UILabel中一个很多人都会踩的坑

一个很严肃的问题,平常你是怎么设置UILabel的高度的? 我见过不少如下普遍的写法: UILabel *lb = [UILabel new]; lb.text = @"gyjq"; lb.font = [UIFont systemFontOfSize:30]; lb.backgroundColor = [UIColor clearColor]; [self.view addSubvie...

应届生应聘iOS岗位的面试建议

每年都有大量的应届毕业生投入到iOS开发大军当中,我过去3年也面试过不少应届生,总体感觉出类拔萃者相当稀少,泯然众人者还是占多数,大部分人对iOS技术面试会是什么样没什么概念,更不知道该怎么去准备一场面试。其实毕业季学校都留给了每个人充足的自由时间去准备学习,对于,仅以过来人提些切实可行的建议帮助刚毕业的同学们,以下这些建议花三个月准备绰绰有余。 相信自己的选择,全力以赴 在开始准备面试...

realm之于iOS

Realm是除了CoreData和Sqlite之外的第三个选择,一个近几年兴起的全新的数据库方案,一直保持着活跃的更新,而且引起了iOS开发圈广泛的关注。Realm到底好不好用,又有哪些闪光点呢?下面通过一个实际的demo综合比较CoreData和Realm在使用体验上的差别。 Realm Realm For iOS正式诞生于2014年左右,一开始就引起了不小的关注,两年多的快速迭代使其...

iOS端数据库解决方案分析

很早之前就想写一篇iOS端数据库相关的总结文章,梳理下使用移动端数据库的一些重要知识点,再综合对比下sqlite和CoreData的优缺点,希望能帮助一些这方面经历较少的同学少走一些弯路。 为什么要用数据库 iOS端持久化的方案选择比较多,NSUserDefault,Keychain,File,sqlite都可以帮助存储关键的业务数据。NSUserDefault和Keychain都是轻量...

一些NSArray,NSDictionary,NSSet相关的算法知识

iOS编程当中的几个集合类:NSArray,NSDictionary,NSSet以及对应的Mutable版本,应该所有人都用过。只是简单使用的话,相信没人会用错,但要做到高效(时间复杂度)精确(业务准确性),还需要了解其中所隐藏的算法知识。 在项目当中使用集合类几乎是不可避免的,集合类的使用场景其实可以进行抽象的归类。大多数时候我们需要将若干个对象(object)暂时保存起来,以备后续的业...

iOS开发之玩转蓝牙CoreBluetooth

之前详细谈过不少关于HTTP协议的知识点,TCP/IP也通过tcpdump做过简单的介绍,但网络协议的本质其实是连接,设备或者端之间连接的方式有多种,常见的http或者基于tcp的socket只是森林一叶,还有些不那么常见的协议比如蓝牙。适当脑洞,也能玩出不少新花样来。 关键概念 谈到蓝牙,很容易让人联想到蓝牙穿戴设备,好像听起来更靠近硬件层一些。苹果其实对iOS和OSX上的蓝牙已做了一...

iOS被忽视的Extension开发

估计现在有过iOS App Extension开发经验的朋友还不太多。说来惭愧,我也是最近以Extension的方式写过Xcode的一个插件之后,才把Extension相关的知识点梳理了一遍,技术和想法上都有些新的收获。顺便写篇文章介绍推广下App Extension开发。 何谓App Extension? iOS生态圈向来以其封闭性闻名,封闭一方面提高了第三方应用的质量,另一方面也使得...

深度重构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项目网络模块的方方面面,也给自己做下知识梳理。 预热 网络模块的接口设计不在本文讨论之列,设计思路有些偏个人口味,我...