ReactiveCocoa
FRP全称Function Reactive Programming,从名称就能够看出来这个模型关键就是Function Programming和Reactive Programming的结合。那么就先从函数式编程说起。说函数式编程前先聊聊链式编程,先看看一个开源Alert控件的头文件里定义的接口方法的写法。
1 |
|
FRP全称Function Reactive Programming,从名称就能够看出来这个模型关键就是Function Programming和Reactive Programming的结合。那么就先从函数式编程说起。说函数式编程前先聊聊链式编程,先看看一个开源Alert控件的头文件里定义的接口方法的写法。
1 |
|
当项目越来越大,引入第三方库越来越多,上架的APP体积也会越来越大,对于用户来说体验必定是不好的。在清理资源,编译选项优化,清理无用类等完成后,能够做而且效果会比较明显的就只有清理无用函数了。现有一种方案是根据Linkmap文件取到objc的所有类方法和实例方法。再用工具逆向可执行文件里引用到的方法名,求个差集列出无用方法。这个方案有些比较麻烦的地方,因为检索出的无用方法没法确定能够直接删除,还需要挨个检索人工判断是否可以删除,这样每次要清理时都需要这样人工排查一遍是非常耗时耗力的。
这样就只有模拟编译过程对代码进行深入分析才能够找出确定能够删除的方法。具体效果可以先试试看,程序代码在:https://github.com/ming1016/SMCheckProject 选择工程目录后程序就开始检索无用方法然后将其注释掉。
1 |
|
UIView有三个基类:UIResponder,UIView和UIControl。
避免使用drawRect:在CPU上做渲染,如果希望使用GPU渲染就使用现有的视图构建自定义视图。如果要实现一个带边框的圆形头像
1 |
|
PhotoKit比AssetsLibrary的特性更多表现更好。可以观察照片库的变化和创建提交自己修改的改变。官方代码示例https://developer.apple.com/library/ios/samplecode/UsingPhotosFramework/Introduction/Intro.html#//apple_ref/doc/uid/TP40014575 ,WWDC session视频
所有PhotoKit对象都继承PHObject抽象类,公共接口只提供localIdentifier属性。
OpenCV是开源计算机视觉和机器学习库。包含成千上万优化过的算法。项目地址:https://opencv.org/about.html。官方文档:https://docs.opencv.org/modules/core/doc/intro.html。OpenCV已支持OpenCL OpenGL,也支持iOS和Android。OpenCV的API是C++的,所以在iOS中最佳实践是将用到OpenCV功能写一层Objective-C++封装。这些封装把OpenCV的C++API转化为安全的Objective-C API。
1 |
|
文中较详细介绍GCD队列,各种GCD使用方法,实例如何使用Dispatch Source监听系统底层对象,分析不同锁的性能对比,实例GCD死锁情况。文中的Demo在这里 https://github.com/ming1016/GCDDemo 对着文章试着来调demo体会更深哦,细细嚼消化好:)
GCD(Grand Central Dispatch) 介绍
GCD属于系统级的线程管理,在Dispatch queue中执行需要执行的任务性能非常的高。GCD这块已经开源,地址https://libdispatch.macosforge.org。GCD中的FIFO队列称为dispatch queue,用来保证先进来的任务先得到执行。
GCD概要
和operation queue一样都是基于队列的并发编程API,他们通过集中管理大家协同使用的线程池。
公开的5个不同队列:运行在主线程中的main queue,3个不同优先级的后台队列(High Priority Queue,Default Priority Queue,Low Priority Queue),以及一个优先级更低的后台队列Background Priority Queue(用于I/O)
可创建自定义队列:串行或并列队列。自定义一般放在Default Priority Queue和Main Queue里。
操作是在多线程上还是单线程主要是看队列的类型和执行方法,并行队列异步执行才能在多线程,并行队列同步执行就只会在这个并行队列在队列中被分配的那个线程执行。(TorchLennon 指出先前文中此句一处错误)
基本概念
系统标准两个队列
1 | //全局队列,一个并行的队列 |
自定义队列
1 | //串行队列 |
简介
block可以当做匿名函数,可以在两个对象间将语句当做数据来进行传递。具有封闭性closure,方便取得上下文相关状态信息。简单 block 定义就像函数指针,用^替代了*。
Block的创建
1 | int main(int argc, const char * argv[]) { |