1.关键点
再多线程 存储数据的,要通过FMDB Queue 串行队列
dispatch_queue_set_specific就是向指定队列里面设置一个标识。
2.同步串行
- (void)close {
FMDBRetain(self);
dispatch_sync(_queue, ^() {
[self->_db close];
FMDBRelease(_db);
self->_db = 0x00;
});
FMDBRelease(self);
}
3.attribute
attribute 可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute).
该属性通知编译器函数从不返回值
extern void exit(int) attribute((noreturn));
4.__has_feature
过给定的值,判断编译器是否支持该特性类似的特性
__has_feature(objc_arc),表示支持自动引用计数机制(ARC)
@noescape
@noescape 用来标记一个闭包, 用法如下
func hostFunc(@noescape closure: () -> ()) -> Void
@noescape字面意思是无法逃脱. 在上例中, closure 被@noescape修饰, 则声明 closure 的生命周期不能超过 hostFunc, 并且, closure不能被hostFunc中的其他闭包捕获(也就是强持有).
用例
func hostFunc(@noescape closure: () -> ()) -> Void {
//以下编译出错, closure 被修饰后, 不能被其他异步线程捕获
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
closure()
}
}
网友评论