余额不足.

余额不足.

s

iOS性能优化-页面流畅度篇
楔子其实市面上有很多关于卡顿优化相关的文章,从入行没多久就接触到了YY大神的iOS 保持界面流畅的技巧延伸到现在百花齐放的各路优化技巧,但是万变不离其宗的原理还是减少CPU和GPU的工作量,让这二位兄弟不用处理高强度的任务。 卡顿产生的原因 当主线程启动时会先有CPU处理好需要显示的数据,然后交付给GPU,然后GPU通过合成、渲染等操作将处理结果提交到帧缓存中,当垂直同步信号到达时将处理结果显示到屏幕上。每个垂直同步信号到达的间隔约为16.67ms(1秒60帧),如果在CPU和GPU在垂直同步信号到达直接就交付处理结果到帧缓存中则不会产生卡顿,而当CPU和GPU两者处理时间大于16.67...
iOS性能优化-能源篇
WWDC2017有一篇关于节省电池能源的分享,视频中表示图中的四兄弟就是吃掉大量电池能源的罪魁祸首:1、CPU的处理工作2、网络3、定位4、图形处理 网络的消耗 数据加载现今市面上的App利用网络无非是为了加载数据、上传图片/文件以及上报用户分析数据(埋点)。早些年可能有部分App加载数据可能是用定时器操作,经过固定的一段时间就拉取一次数据。这样的操作方式需要CPU执行一个定时器,然后每一段时间就需要加载一次网络请求,这样的开销可想而知。 上传图片/文件可能目前有些App的操作方式是拿到上传任务就马上开始进行图片/文件上传,如果失败或者超时了就进行重试,这样的操作方式下大概的能源消耗...
iOS提升效率的几个Tips
工具篇CrashesXcode内置一个强大无比的Crash收集系统,在Windows-Organizer中可以找到他。这里收集crash的前提是触发crash的手机打开了与App开发者共享功能,这样产生的crash日志才能上传到苹果服务器上。打开的流程为 设置-隐私-分析与改进,这里需要同时打开共享iphone分析和与App开发者共享。Organizer下的Crashes能准确的定位到出问题的代码是哪一行,现在我们在bugly上看问题可能只能定位到哪个类的哪个方法除了问题,但是具体哪一行还需要具体分析,有时候看着该方法都觉得:“这TM哪有问题啊”,就像上图的问题,在bugly报的错是:你...
为什么要设计metaclass
引今早起床打开微信,发现知识小集推送了一篇文章《阿里、字节:一套高效的iOS面试题》,打开瞅了眼,看到第二题就给我看懵圈了,为什么要设计metaclass?在我的知识体系中关于元类的认知是类对象的isa指向元类对象,元类对象存储着类方法列表,然后就没有然后了。 带着这个疑问我边开始google了,找到一文Why is MetaClass in Objective-C?,该文很好的解释了OC面向对象能力的部分师承于Smalltalk,通过类的划分和消息传递两个亮点解释了为什么要有metaclass,但是我想仅仅通过设计层面解释恐怕打动不了面试官,如果面试官反问为什么OC要借鉴Smallta...
Autorelease知多少
引最近脑子里冒出一个疑问,子线程的RunLoop默认是没有开启的,需要程序猿手动去开启,那子线程的Autorelease对象是在什么时候被销毁的? 带着问题google了一翻,发现有些博客里说得也挺好的,但就是看不下去,我这颗浮躁的心啊!带着问题自己去溯源吧,可能看源码更能让我快乐一些!手动狗头。 从头开始国际惯例是对含有AutoreleasePool的代码进行clang -rewrite,大家都明白怎么一回事,为了省点篇幅就省略了,直接标记重点。 123456789void *objc_autoreleasePoolPush(void){ return Autorele...
深入浅出RunLoop
楔子123456789101112131415161718192021class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() DispatchQueue.global().async { print("1") self.perform(#selector(self.aaa), with: nil) self.perfor...
GCD线程管理-内核相关
pthread_wqthread()从上文的分析我们了解到了内核的调用链如下: 123start_wqthread -> _pthread_wqthread ->_dispatch_worker_thread2 ->_dispatch_root_queue_drain ->_dispatch_queue_override_invoke ->_dispatch_client_callout -> _dispatch_call_block_and_release 12345678910111213141516171819202122232425262728...
GCD线程管理从入门到放弃
源头刚敲完一波业务代码,脑子里突然传来一个想法,对象一般能自动销毁,线程也同样也会被自动回收,那这个自动回收是怎么做到的呢?心动不如行动,先找GCD的源码libdispatch,这里用的是libdispatch-1008.200.78.tar.gz版本。 平时如果需要用到多线程,想必大家都是这样的一套基本操作: 123dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ }); 那这一条熟的不能再熟的代码里都藏着一系列什么样的操作? likely(...
扒一扒Category以及关联对象
从结构说起源码来自objc4-750 1234567891011121314151617struct category_t { const char *name; //!< 分类名称 classref_t cls; //!< 属于哪个类 struct method_list_t *instanceMethods; //!< 实例方法列表 struct method_list_t *classMethods; //!< 类方法列表 struct protocol_list_t *protocols; ...
年初的一些感慨
不知不觉2018和2019已完成了交接,戊戌年也许是比较惨淡的一年吧,年中老外公的离开已让我唏嘘不已,年尾又收到了被裁的通知,早早的提前过年了,有的人悲伤有的人欢喜,当时还闹的不可开交,但过去了也就那么一回事,有的同事脑子不清醒,向竞品公司泄漏公司数据,反倒被一纸装书送上了法庭。唉,不提也罢! 年底休息了大概一礼拜,开始了寻找工作的旅程,戊戌年资本市场的不堪导致了各个公司都停止招聘甚至裁员,从最开始的二维火降薪20%开始,到阿里收缩HC,然后卖好车CEO发了一封全员信便开始了裁员,很不幸,我在名单里,刚被拓爷喊去的那一瞬间我知道就要离开这家呆了近三年的公司了,拓爷说何必为了那点钱而背上被...
avatar
余额不足
人必有所执,方能有所成。