2016年&猴年总结

距离去年写总结时间已经过去11个月,在这年关将至的时候,本人写一篇2016年的总结来鞭策督促自己。

和2015年的总结知足常乐一致,找个成语形容呗~

开花结果

2016年依旧是本人的家庭年~ 人生的几大事件里其中两件发生在了这一年里。开花结果指的是家庭组建&女儿的诞生哇~

more

通过全文相似度来寻找相同或相似的代码

最近笔者在职的公司在不断的做App的包瘦身工作, 身边的同事们也研究出了各种各样实用的工具来辅助加快包瘦身的进程。在这么一个大环境下, 笔者突然又冒出一个很无聊的工具想法

通过文本匹配来寻找相似的方法函数

笔者给这个小工具取了一个非常传神且牛逼的名字 - SameCodeFinder

和上一个查找Block的无聊的小工具RiskBlockScanner类似, 这个工具笔者觉得也是一个应用面相对比较小的一个工具, 所以笔者自嘲无聊的小工具哈~

笔者自认为这个是一个无聊的小工具, 但是还是坚持把它开发出来了, 因为笔者坚信:

任何一个无聊小众的作品, 在合适的时机总是能够帮助到合适的人的!

笔者开发这个小工具除了因为笔者相信这个工具肯定能够帮助到部分人群以外, 还有另外一个目的是督促自己不要停止学习的步伐哈~

more

一个奇怪且无聊的检测Block的想法

在大多数iOS应用开发过程中, 循环引用一直都是最常见的iOS开发问题之一。通常情况下, 最常见的循环引用问题就是在Block回调中的self指针的不当使用了。在这种最常见的场景中, 对象self本身使用的Block被self对象本身持有(临时变量block是不会形成循环引用的), 而在Block回调中又使用了self导致形成了一个循环引用。

1
2
3
4
5
6
7
8
9
self.myBlock = ^{
[self doSomething];
};
+-----------+ +-----------+
| self | ref | Block |
---> | | --------> | |
| retain 2 | <-------- | retain 1 |
| | ref | |
+-----------+ +-----------+

针对上述最常见的循环引用的场景, 在市面上最常用的几款循环引用检查工具都不能特别有效的检测出是否真正的产生了循环引用。笔者针对这种场景突然脑洞大开, 设想是否能够通过文本扫描的方式提前知道哪些block使用场景可能会产生潜在的循环引用问题。为了支持自己的大脑洞想法, 笔者尝试用python书写一个文本扫描器来提前预知潜在Self Retain Block循环引用风险的代码。哈哈, 至此, 一个无聊又奇怪的检测Block的小工具RiskBlockScanner就诞生了。

more

矢量图在iOS中的应用细节

对于矢量图的调研, 最开始是始于对其占用iOS App的空间的好奇。笔者好奇一个问题: 利用矢量图能不能帮助iOS App减少整体空间?

iOS其实在很早的时候就已经支持矢量图的应用(XCode 6时代开始支持), 只不过因为大部分开发者沿用了以前@1x、@2x、@3x格式图的习惯, 并没有一个地方专门普及使用矢量图。当然, 还有另外一个原因就是iOS对复杂的矢量图支持的不是很好。

本文并没有特别深入的技术点, 仅仅只是笔者做的几个实验的总结和矢量图基础使用的教程普及~

more

在Pod库中使用xcasset的拷贝陷阱

本篇文章来自笔者工作中遇到一个难解的BUG - 在App中用UIImageimageNamed:方法读取的图片始终是不正确的。

暴走示意

场景条件回放:

  1. 有多张同名图片存在工程下, 比如都叫pic_same_test
  2. 同名图片有存在被工程引用的子Bundle中, 主Bundle中和xcasset中
  3. 同名图片未被工程引用进来, 但是放置在工程物理目录下的某个xcasset中

试想一下, 这个时候你如果使用下述代码去读取该图片, 会发生取到哪种图片呢?

1
UIImage *image = [UIImage imageNamed:@"pic_same_test"];

在上述的条件场景中, 当我在应用中用UIImage去读取A图片的时候, 总是会读取到了错误的B图片。因为笔者最初的排查方向只在条件1条件2两个方向去查找, 没有去深究未被工程引用的部分, 导致了整个思路方向被引向了错误的方向, 极大的加深了BUG的排查难度。

笔者在这个问题上纠结了很久, 在Stackoverflow苹果开发者论坛都根据这个场景进行了提问, 最终在开发者论坛中经过昵称为Bob133的高人指点, 将问题的突破口定位在了xcasset上。

more

我只是想要截个屏(续)

上两天写了一篇《我只是想要截个屏》的博文, 来描述了在书写SwViewCapture中遇到的一些坎坷和解决方案。在《我只是想要截个屏》中并没有找到针对WKWebView的全内容截图的相对完美的解决方案, 只是用一种滚动的暴力的方式去截图然后组装临时解决。

本文主要在上篇文章中做一些粗略的补充, 来描述SwViewCapture中是怎么更好的解决WKWebView的截屏问题, 还有怎么找到这种取巧的解决方案的~

PS: 如果大家想直接看实现原理, 请跳过几次失败尝试章节~

more

我只是想要截个屏

想必使用iPhone的用户, 大家都知道按照Home键+电源键就可以截屏了。 截屏对于产品经理、工程师、设计师都比较重要。那么在iOS中用代码截屏也是再常用不过的功能了~ 那么在iOS研发中, 怎么样才能有效的截屏呢? 笔者在上周用了2天时间去写了一个Swift版本的截图开源库 - SwViewCapture

起初笔者有一个小小的想法, 怎么样去截取整个网页甚至整个滚动视图的内容呢? 造一个支持该功能的开源库会不会受欢迎呢? 基于CocoaChina+ App的分享思路以及笔者自己的一点小想法, 笔者决定写一个方便Swift开发者使用的截屏库, 支持截取页面载体所有内容的库。

  • 该想法的起源来自于@子循的一个开源App - CocoaChina+, 在该App中, 用户可以分享用户正在浏览的页面内容, 也就是WebView的内容。

大家可能好奇, 就这么一个截屏, 需要写2天么? 一开始笔者的想法很简单: 无非就写一个截屏库。笔者真正实际写起来的时候, 才发现原来光光一个截屏也有这么多的坎等着我去踩。笔者代码截屏中遇到的困难在此处梳理了一下, 防止大家也重复采坑。

more

iOS界面跳转的一些优化方案

App应用程序开发, 界面跳转是基础中的基础, 几乎没有一个App是用不到界面跳转的, 那么怎么样去书写界面跳转代码才是比较合理的呢?

大家可能在想跳转无非就2种方式, 能有什么内容? 其实并不是这样子的, 对于研发老手来说, 大型应用几乎都是利用URLScheme进行全方位的解决方案; 对于研发新手来说, 他们可能并没有遇到多路口界面跳转的瓶颈, 只会使用一些常用跳转, 并不会意识到界面跳转潜在的一些问题, 甚至无法严格区分Present和Push的操作区别~

本文将针对界面跳转提出一些优化解决方案~

more

2015年&羊年总结

既然决定要长期坚持写博客, 那么产出水帖也是必然的了~ 本文是个人今年的总结, 并没有啥技术含量哈~ 整年总结是以下四个字:

知足常乐

在某种程度上也算是自我安慰, 因为今年并没有实现重大的自我突破~ 在工作、家庭都没有取得什么实质性的进展, 但是也并没有过的不好~

more

Pods依赖库快速开发入门

CocoaPods是所有iOS开发熟知的一个第三方类库依赖管理工具。只要稍微有些经验的iOS开发者都会使用三方依赖库管理工具来管理工程依赖, CocoaPods是目前最火热权威的管理工具。

CocoaPods的基本使用现在网站上遍历都是的教程, 官方文档的简明教程也足够清晰明朗。本篇文章主要告诉大家如何去开发一个CocoaPods依赖库, 重点内容分三块:

  1. 如何创建一个Pod Repo
  2. 如何将库提交到中央Spec库或私有Spec库中供大家使用
  3. 如何在开发中添加resource、framework以及其它依赖

more

本站总访问量 本站访客数人次