GCD学习笔记<三> —— 信号量

系列文章目录

GCD学习笔记<一>

GCD学习笔记<二>

GCD学习笔记<三>

写在前言:最近忙着面试,正好复习GCD和操作系统,于是续写前面这个系列的文章,本篇主要是讲GCD中的信号量。

Dispatch Semaphore

既然是多线程,就肯定离不开一个关键的东西——Semaphore(信号量)。

信号量是一个特殊的变量,程序只能在临界区访问它,也就是说只能对它进行原子操作,而且只允许对它进行请求(P操作)和释放(V操作)。信号量的存在是为了保证多线程资源请求的有序性。不理解的自行复习操作系统。

在GCD中,我们用dispatch_semap......

深入理解AutoreleasePool

提起Objective-C的内存管理,除了MRC和ARC之外,我们也不得不提及autorelease。

autorelease看起来很像ARC,使用NSObject类的autorelease方法可以在AutoreleasePool被释放时,调用对象中的release方法,它是提供了一种在将来某个时间释放对象的机制,能够避免对象立刻被释放的情况。

我们常常见到的代码是这个样子的

@autoreleasepool {

// balabala

}

当然也有可能是这个样子的(非ARC环境下),但是苹果并不推荐一下这种形式

NSAutoreleasePool *pool = [[NSAuto......

空合运算符 Swift vs Objective-C

Swift

我们知道Swift中定义了一种新的运算符 ??,即空合运算符(Nil Coalescing Operator)

如 a ?? b就是对a进行空值判断,如果a不为nil,则返回a,否则返回b。Apple针对这个符号还设定了两个条件:

表达式a必须是Optional类型

表达式b必须和a的存储类型保持一致

值得注意的一点,这个运算符也是短路运算,如果a成立,表达式b则不会进行计算。

空合运算是a != nil ? a! : b的简写,的确简洁而优雅。

举个例子来说明这些特性,

var a:Int? = 10

var b = 20

var d = a ?? (++b)

prin......

AOP(面向切面编程) & Aspects 源码解析

AOP(面向切面编程)

AOP,即Aspect Oriented Programming(面向切面编程),Gregor Kiczales(AOP的提出者)是这样介绍AOP的

We present an analysis of why certain design decisions have been so difficult to clearly capture in actual code. We call the proper-ties these decisions address aspects, and show that the reason they have been ......

do/while(0)模式

在阅读Aspects源码时,发现了这样一个宏

#define AspectError(errorCode, errorDescription) do { \

AspectLogError(@"Aspects: %@", errorDescription); \

if (error) { *error = [NSError errorWithDomain:AspectErrorDomain code:errorCode userInfo:@{NSLocalizedDescriptionKey: errorDescription}]; }}while(0)

引起了我的注意,......