共计 19 篇文章

如何优雅地调试

几乎所有高级语言的编译过程都是预处理>编译>汇编>链接,而gcc是应用最广的编译器了。但是apple嫌弃他太臃肿,于是就有了Clang(编译器前端),LLVM(编译器架构,本质是一个库),LLDB(调试器) 效率低下的调试方法 打断点配合NSLog,这真是最朴素的调试方式。 NSLog效率低下的原因及尝试lldb断点打印Log这篇博客里有个测试,NSLog和printf的效率差了100多倍。调试的NSLog还好,记得自己删掉就行,但是代码里充斥着许多的NSLog日志,肯定是消耗性能的。 一般是这样处理: ...

从一次内存峰值说起

最近把一个游戏内嵌到app里,选用了微信开源的Mars,结果遇到了内存峰值。解决的方法很容易,加上@autoreleasepool就可以了。但是做实验的时候又有了好多疑惑,不停地往深处挖,最终了解了autoreleasepool的实现,Tagged Pointer,和NSString内存管理的特殊性。 Mars 我们做的小游戏需要实时传输数据,数据很小,就选用了Mars。结果内存一直涨,在这里加个autoreleasepool就可以避免内存峰值。 void StnCallBack::OnPush(int32_t _cmdid, const AutoBuffer& ...

多线程单线程,同步异步,并发并行,串行队列并行队列,看这里就对了

多线程开发用了很久,但是一直没去深入了解。长久以来一直有一些迷惑。直到深入了解后,才发现了以前的理解有不少错误的地方。 单线程等于同步,多线程等于异步 这种理解很直观,毕竟只有一个线程怎么异步? Node.js表示不服,我就是单线程,我也能异步。谈一谈Node中的异步和单线程。 看完这篇文章我明白了单线程也能异步,把IO等耗时的操作比作烧水,我可以在这个时候切菜,这就是异步啊。 等等,似乎有点不对,那io又谁来开启,又谁来通知cpu我已经结束了呢? Node.js异步IO的实现,这篇文章解决了我的疑惑。 Node. ...

iOS网络层设计感想

App的开发无外乎从网络端获取数据显示在屏幕上,数据做些缓存或者持久化,所以网络层极为重要。原来只是把AFNetwork二次封装了一下,使得调用变得很简单,并没有深层次的考虑一些问题。 前言 参考: 网络层设计方案 这篇文章提的问题也正是我平时经常纠结的,但是一直没有深入思考。文章给的解决方案和为什么这样做让人茅塞顿开。以下主要就是我的观后感。 三个问题 使用哪种交互模式来跟业务层做对接? 是否有必要将API返回的数据封装成对象然后再交付给业务层? 使用集约化调用方式还是离散型调用方式去调用API? 我的设计 基本上每个网络层都会涉及到这三个问题。 我原先的设计是: //APIClient.h @interface APIClient : AFHTTPSessionManager + (instancetype) ...

一个好的图片加载缓存框架是怎么样炼成的?

SDWebImage基本上是app开发的标配了,它的源码我一直没有去看。因为我觉得图片加载缓存很容易,无非是先看两级缓存有没,有就加载,没有就去服务端获取并缓存下来。无非在图片的解码,缓存的策略上显点神通提高效率罢了。然而我还是太年轻了,当自己真正地去实现一个图片加载缓存的功能时,就发现里面的学问还是很大的。 几个问题 首先考虑最常见的情况,就是tableView上每个cell都有一个头像,然后只像SD那样sd_setImageUrl。基于此先问4个小问题,如果4个问题都有答案了,那就不用在往下看了。 tableView有cell复用问题,用户下拉后,原先的图片请求完成,cell会加载导致头像乱序,怎么避免? 有个请求失败了,接下去有相同的请求怎么办? ...