1.Objective-C高级编程 多线程与内存管理这本书是我一年前看的有些忘了,过年了有时间总结一个 方便以后回顾.
2.第一章主要是讲内存管理感觉比较简单不想记录了,第二章是block(C语言的扩充功能)即带有自变量的的匿名函数.
(1)__block Block语法的表达式中将值赋给在Block语法外声明的自动变量,需要在该自动变量上附加__block说明符.
(2)Block循环引用 Block中使用附有__strong修饰符的对象类型自动变量,那么当Block从栈复制到堆时,该对象为Blcok所持有.为了避免循环引用可声明附有__weak修饰符的变量将self赋值使用例如:id __weak tmp = self;
比较__block.__weak.__unsafe_unretained修饰符避免循环引用
使用__block变量的有点如下:
·通过__block变量可控制对象的持有期间
·在不能使用__weak修饰符的环境中使用__unsafe_unretained修饰符即可
在执行Blcok时可动态的决定是否将nil或其他对象赋值在__block变量中
使用__block的缺点如下:
·为避免循环引用必须执行Block
多线程(GCD)
1.UI界面的更新一定要在主线程处理,多线程中处理例如数据库的访问,图像识别等
2.使用多线程需要注意数据竞争,死锁,使用过多消耗内存等.
3.多线程处理数主要取决于cpu核数以及cpu负荷等
4.dispatch_set_target_queue可以防止处理并行执行
5.dispatch_after不是在指定时间后执行处理,而只是在指定时间追加处理到dispatch queue
6.dispatch_barrier_async函数会等待追加到Concurrent Dispatch Queue上的并行执行的处理全部结束之后,再将指定的处理追加到该 Concurrent Dispatch Queue中.然后dispatch_barrier_async函数追加的处理执行完毕后,Concurrent Dispatch Queue恢复为一般动作.使用Concurrent Dispatch Queue和dispatch_barrier_async函数可实现高效率的数据库访问和文件访问.
7.dispatch_suspend/dispatch_resume(对以执行的处理没有影响)
dispatch_suspend可以将没有执行的挂起,挂起后追加到Dispatch Queue中但未执行的处理在此之后停止执行.恢复后则可以继续执行
8.Dispatch Semaphore(信号)
可以更细粒度的进行排他控制
例:dispatch_semaphore_t semaphore = dispatch_semaphore_creat(1);
dispatch_async(queue,^{
dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER);
dispatch_semaphore_signal(semaphore);
}
dispathc_release(semaphore);
9.dispatch_once(用于单例)
10.网络下载处理不适用GCD,网络编程中不可使用线程,使用用于异步网络通信的API.