第37条 理解 block 这一概念
block里可以直接修改成员变量的值,而不用 __block 修饰。
如果block里调用了成员变量也会间接地保留self。
其中最重要的就是invoke变量,这是个函数指针,指向block的实现代码。
block会把所有调用的变量都copy一份,注意,并不是copy对象本身,而是指向这些对象的指针变量。
全局块:空block或不调用任何外面变量的block。
栈块:调用了外部变量,只会被执行一次,执行结束后会被系统释放。
堆块:被copy到堆中的block。
第38条 为常用的block创建typedef
有时候同一个block,不同的功能,可以定义两个typedef,以便区别不同的功能。
第39条 用handle块降低代码分散程度
设计block方法时,如果想修改block的回调线程,可以增加一个queue的参数。
第40条 用block引用其所属对象时,避免保留环
- (void)method
{
[self.teacher requestData:^(NSData *data) {
self.name = @"name";
self.teacher = nil;//加上这句可以避免循环引用,但是若该方法未被调用,则内存还会泄漏
}];
}
- (void)backButtonClick:(id)sender
{
if (self.backButtonBlock != nil) {
self.backButtonBlock();
}
self.backButtonBlock = nil;//此处加上该代码,可以让调用者不用管内存问题,即使不用weakSelf也不会泄露
}
第41条 多用派发队列,少用同步锁
第42条 多用GCD,少用performSelector系列方法
第43条 掌握GCD及操作队列的使用时机
使用NSOperationQueue的好处:
1.取消某个操作。NSOperation有专门的cancel方法,不过已经启动的任务无法取消。
2.可以指定依赖关系。GCD也可以实现,但是没NSOperationQueue方便,特别是复杂的队列依赖关系。
3.NSOperation有很多属性,如,isCanceled、isFinished,可以方便的监听各个任务的状态。
4.可以方便的设置任务优先级。