iOS与OS X多线程和内存管理 - GCD
前言iOS与OS X多线程和内存管理 读书笔记(三) GCD
笔记GCD概要
GCD:Grand Central Dispatch,大中枢派发,很牛逼的名字
GCD的API
dispatch_async(queue, block);
将想要执行的任务封装进Block,放他到queue中执行。这里的queue有两种:
一种是Serial Dispatch Queue,顺序队列,放入这里面的block任务是一个一个执行的,先进先出。
另一种是 Concurrent Dispatch Queue,并行队列,意思就是会开多个队列,block一次进入各个队列同时执行;但是队列的数量由系统控制,那些还来不及进入任何一个队列执行的block,只能等某个队列的block执行完了,再进入队列执行了;所以说这里的每个block的执行顺序是不确定的。
PS:当然你也可以同时开多个顺序队列,以达到并行队列的效果;但是不能多开,因为程序在各个队列之间切换,也就是在各个线程之间切换,也就是所谓的上下文切换,需要耗费CPU等资源。当然存放每个线程的状态等信息也需要耗费资源。
dispatch_queue ...
iOS与OS X多线程和内存管理 - Blocks
前言iOS与OS X多线程和内存管理 读书笔记(二) Blocks
笔记Blocks概要
Blocks:带有自动变量(局部变量)的匿名函数
完整的Block语法与一般的C语言函数定义相比只有2点不同:
开头多了^符号
没有函数名
看看如何声明Block类型变量:int (^blk)(int);声明了一个参数类型为int,返回类型为int的Block变量blk。
typedef int (^blk_t)(int); 那么blk_t代表一个Block变量
Block会自动截获和保存变量值。但是不能更改保存的变量值,除非你使用__block。如下:
12345678int val = 0;void (^blk)(void) = ^{val = 1}; // 更改自动保存的变量值 报错blk();/* 使用__block之后 */__block int val = 0;void (^blk)(void) = ^{val = 1}; // 不报错blk();
PS:如果是截获的OC对象,比如截获了NSMutableArray对象array ...
iOS与OS X多线程和内存管理 - 自动引用计数
前言iOS与OS X多线程和内存管理 读书笔记(一) 自动引用计数
笔记##内存管理/引用计数
使用办公室的照明灯来做比喻,对象相当于照明灯,但是会有许多人需要这个照明灯,也就是持有对象。只要有人持有这个对象,就不能释放对象;若没人在需要对象,就释放对象。
例如:a = [class new]; b = a; 那么a生成对象时持有对象,b也持有对象。只有当a和b都不持有对象时,才能释放对象。
对于对象,有4个关键词。生成,持有,释放和废弃。
看看对应的操作:(以下的方法均是NSObject类的方法)
使用alloc/new/copy/mutableCopy开头的方法生成并持有对象
retain方法持有对象
release方法释放对象
dealloc方法废弃对象
自己生成的对象自己持有
123id obj = [[NSObject alloc] new]; // alloc方法生成并持有对象// orid obj = [NSObject new]; // new 和 alloc + init 一样
另外copy和mutableCopy也是 ...
iOS Core Animation - The Performance of a Lifetime
前言iOS Core Animation 读书笔记(三)The Performance of a Lifetime
笔记Tuning for SpeedCPU Vs GPU
将各个layer以及layer的动画渲染到屏幕上由系统来控制,这个控制器称为render server。
绘制的过程如下:
Layout:这个阶段建立好你的view树和layer树,并给layer设定好各种属性(frame,background color等等)。
Display:这个阶段在每个layer上面画他们的backing image。这个阶段可能会调用-drawRect:或者-drawLayer:inContext:方法。
Prepare:这个阶段Core Animation准备好要传递给render server的动画的相关参数。
Commit:这个阶段Core Animation将所有的layer和动画属性一起打包,传递给render server,让它显示。
render server计算每个layer每个属性以及动画过程的中间值,然后设置OpenGL的各个三角形属性等等
在屏幕上绘制可视化的三 ...
iOS Core Animation - Setting Things in Motion
前言iOS Core Animation 读书笔记(二) Setting Things in Motion
笔记Implicit Animations隐式的动画由framework自动执行,除非你叫他不执行。
Transcations
Core Animation会去假设你所有创建在屏幕上的东西都会animation。所以animation并不用你刻意的去启动。这也是Core Animation比OpenGL慢的一点,OpenGL不用去考虑这些东西,就不需要花费额外的性能代价。
当你改变一个CALayer的属性时,它会自动平滑的执行动画从当前属性到新的属性,而不是瞬变。不需要你额外的做些什么。这种动画就叫做隐式动画。
Transcations是Core Animation将一系列动画汇集成一个的机制。一旦transaction提交(committed)之后,这些动画就会开始执行。
CATransaction类控制着transaction的行为。该类没有alloc init这样的初始化,也并不是如名字那样代表一个transaction,它表示一个transaction的栈。可以 ...
iOS Core Animation - The Layer Beneath
前言iOS Core Animation 读书笔记(一)The Layer Beneath
笔记The Layer Tree
Layer Kit: 高效的,硬件加速的混合框架, 用来替代以Quartz为基础的,相对低效的AppKit框架。它也就是Core Animation的基础。
Core Animation 不仅仅只和动画有关,它是iOS的核心组件之一,你在屏幕上看到的所有东西都由它来power。
Core Animation的主要工作是将各个可视化的layer显示在屏幕上面。也就是将layer tree显示出来。
UIView handles touch events and supports Core Graphics-based drawing, affine transform, and simple animations such as sliding and fading.
但是UIView并不是亲自处理这些任务中的大部分。渲染,布局,动画…这些任务其实都是由Core Animation里面的CALayer来完成的。
CALayer不负责用户交互(user int ...
卧槽
昨天晚上,也就是2016-6-6这么个666的日子,我ollie过一立了=。=
弹框按钮视图
前言这段时间又在忙项目的事,对Coding-iOS源码的学习只能先暂搁一旁。今天抽空来看看一个Coding-iOS中一个有趣的实现。这个和微博里面发送微博时的动效类似。效果如下👇
前言二源码在这里我自己也简单的实现了一遍,看看效果👇我也把源码上传到github了
分析一波这个PopMenu主要由2部分构成:模糊背景和按钮
模糊背景 模糊背景直接就是白色半透明的View,它是PopMenu这个View的最底层的子View。这个模糊背景View的透明度从0->0.5渐变,当这个动画完成之后,开始显示按钮的动画。
按钮 说是按钮,其实也是一个自定义的View,它由一个图片(UIImageView)和一个标题(UILabel)构成。这些按钮也是PopMenu这个View的子View。
PopMenu View 这个View是主视图,它包括最底层的模糊背景视图和多个按钮视图。在这个视图内部定义了几个重要的方法
定义每一个按钮视图的其实位置和最终位置
未每个按钮视图添加动画
按钮位置先来看看按钮视图的最终位置👇给每个视图定大小很简单:先定死高度为110,再根据每行放置几 ...
iOS关于文件上传与下载
前言最近还在跟着Coding-iOS源码学习iOS开发,现在来介绍一下Coding-iOS的文件下载和上传机制。其实说实话,在写这文章的时候我对这个机制的总体把握也不是很全面;下面我将通过源码再来熟悉一遍这个全过程。这篇文章主要介绍的是下载流程。
源码先行Coding_FileManagerCoding-iOS中将文件下载与上传有关的方法都封装在Coding_FileManager.h和Coding_FileManager.m文件里面。先来看看其中的主要代码👇Coding_FileManager里面包含3个类:Coding_FileManager类,Coding_DownloadTask类和Coding_UploadTask类。其中的Coding_UploadTask类与上传有关,这里不做介绍。
Coding_DownloadTask类Coding_DownloadTask类用来封装每一个下载任务,它包含一个下载任务,下载进度和当前下载的文件名,代码如下👇
12345678@interface Coding_DownloadTask : NSObject@property (no ...
NSObject+ObjectMap 源码分析
前言iOS应用从API获得的数据有很重要的一部分是以JSON格式返回的,通过AFNetworking,这种JSON格式会被转换成NSDictionary或者NSArray,从而被APP所接收。这时,如果能将这些NSDictionary/NSArray转化成APP中已经封装好的各种Model,将极大的简化APP的开发。有很多第三方库已经实现了这个功能,比较知名的就有MJExtension
MJExtension: A fast, convenient and nonintrusive conversion between JSON and model. Your model class don’t need to extend another base class. You don’t need to modify any model file.
嗯,这个第三方库很有名,功能强大,使用也方便,但是本文并不介绍它。在这篇文章里面,我将介绍一个小的从JSON到Model进行转换的第三方库,这个库小到没有一个像样的名字,我在github上也只找到了一个模糊的地址:uacaps ...