RunLoop究竟是怎么运作的

解析RunLoop

RunLoop简介(Introduction)

  1. RunLoop是线程基础架构的一部分。RunLoop存在的目的是让线程在没有任务处理的时候进入休眠,在有任务处理的时候运行。

  2. RunLoop不是完全自管理的,需要你在适当的时候启动。

  3. Cocoa和Core Foundation框架都提供了RunLoop相关的API。

  4. 你不需要自己创建RunLoop对象。每个线程,包括主线程都有一个对应的RunLoop对象。

  5. 只有子线程的RunLoop需要手动启动,主线程的RunLoop在App启动调用Main函数时就已运行。

阅读更多
ReactiveCocoa笔记(二)—— 源码探究
  • 看完源码画的流程图:

RACSignal流程

理解RAC

初学者总是容易被一堆概念搞得晕头转向,我想其实无非是这几种:

1
2
3
4
5
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber){
[subscriber sendNext:@(1)];
[subscriber sendCompleted];
return nil;
}];

  1、createSignal好难啊;
  2、subscriber是什么?
  3、这个block什么时候调用?

阅读更多
ReactiveCocoa笔记(一)—— 框架概览

对于一个应用来说,绝大部分的时间都是在等待某些事件的发生或响应某些状态的变化,比如用户的触摸事件、应用进入后台、网络请求成功刷新界面等等,而维护这些状态的变化,常常会使代码变得非常复杂,难以扩展。而 ReactiveCocoa 给出了一种非常好的解决方案,它使用信号来代表这些异步事件,提供了一种统一的方式来处理所有异步的行为,包括代理方法、block 回调、target-action 机制、通知、KVO 等:
然而,这些还只是 ReactiveCocoa 的冰山一角,它真正强大的地方在于我们可以对这些不同的信号进行任意地组合和链式操作,从最原始的输入 input 开始直至得到最终的输出 output为止

ReactiveCocoa解决的问题:

  1. 传统iOS开发过程中,状态以及状态之间依赖过多的问题
  2. 传统MVC架构的问题:Controller比较复杂,可测试性差
  3. 提供统一的消息传递机制
  4. RAC使用信号监听,类似OC中的KVO机制,使用Block聚合代码逻辑,所以被称为:函数响应式编程。
阅读更多
读《程序是如何跑起来的》

读《程序是如何跑起来的》

前言

操作系统将底层的很多抽象的原理封装成面向对象的、方便大众理解和操作的图形界面、这大大提高了计算机操作的便利性,然而,享受方便的同事也付出了代价,对于底层的了解越来越少,只会使用工具,却无法明白工具的底层机制就无法创造出更好的工具。

第1章 对程序员来说CPU是什么

热身问题

问:

  1. 程序是什么?
  2. 程序是由什么组成的?
  3. 什么是机器语言?
  4. 正在运行的程序存储在什么位置?
  5. 什么是内存地址?
  6. 计算机的构成元件中,负责程序的解释和运行的是哪个?
阅读更多
Git 笔记系列(九)—— Git进阶
时间 更新备注
2018-04-26 新建文章
2018-09-09 添加git账号切换
2019-01-18 更新链接

Git 飞行规则

git-flight-rules/README_zh-CN.md at master · k88hudson/git-flight-rules

git-tips: Git的奇技淫巧

521xueweihan/git-tips: Git的奇技淫巧

阅读更多
Git 笔记系列(八)—— Git常用命令-Stash
时间 更新备注
2018-03-10 新建文章
2018-06-08 整理补充
2019-01-18 更新链接

引言

暂存未跟踪或忽略的文件
默认情况下,git stash会缓存下列文件:

  • 添加到暂存区的修改(staged changes)
  • Git跟踪的但并未添加到暂存区的修改(unstaged changes)

stash就是存储的意思,比如你在做一件事情的同时,突然又有了别的工作。就把现在的工作存储下来。并不提交到主线任务。而且可以顺利恢复上次的进度。

阅读更多
Git 笔记系列(七)—— Git常用命令-Rebase
时间 更新备注
2018-03-08 新建文章
2018-06-09 整理补充
2019-01-18 更新链接

rebase 变基

rebase的定义

Integrates the changes from the chosen branch
into your working copy. Your current HEAD branch
will be rebased onto the integrated revisions.

1
git-rebase - Reapply commits on top of another base tip

即将当前分支的提交放在其他分支的最新的提交后。但是这个reapply并非简单地将提交剪切复制到,Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。

阅读更多
Git 笔记系列(六)—— Git常用命令-Reset
时间 更新备注
2018-03-02 新建文章
2018-06-10 添加和revert&checkout的对比
2019-01-18 更新链接

引言

在提交层面上,reset将一个分支的末端指向另一个提交。这可以用来移除当前分支的一些提交。比如,下面这两条命令让 hotfix 分支向后回退了两个提交。

1
2
git checkout hotfix
git reset HEAD~2
阅读更多
Git 笔记系列(五)—— Git常用命令-Branch
时间 更新备注
2018-03-01 新建文章
2018-06-08 整理补充
2019-01-18 更新链接

引言

几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。 在很多版本控制系统中,这是一个略微低效的过程——常常需要完全创建一个源代码目录的副本。对于大项目来说,这样的过程会耗费很多时间。

Git 处理分支的方式可谓是难以置信的轻量,创建新分支这一操作几乎能在瞬间完成,并且在不同分支之间的切换操作也是一样便捷。 与许多其它版本控制系统不同, 理解和精通Git 分支,你便会意识到 Git 是如此的强大而又独特,并且从此真正改变你的开发方式。

那么,Git 又是怎么知道当前在哪一个分支上呢? 也很简单,它有一个名为 HEAD 的特殊指针。 请注意它和许多其它版本控制系统(如 SubversionCVS)里的 HEAD 概念完全不同。 在 Git 中,它是一个指针,指向当前所在的本地分支(译注:将 HEAD 想象为当前分支的别名)。 在本例中,你仍然在 master 分支上。 因为 git branch 命令仅仅 创建 一个新分支,并不会自动切换到新分支中去。

阅读更多
Git 笔记系列(四)—— Git常用命令-Checkout
时间 更新备注
2018-02-28 新建文章
2018-06-06 添加checkout命令
2019-01-18 更新链接

引言

上篇介绍Git的流程涉及了很多命令,这篇将对介绍Git工作流的命令进行梳理,希望增加对Git的理解,方便大家的使用。

阅读更多