代码块书写格式:<returntype> (^name)(parameter list) = ^(parameter list) {body} (返回值的类型可以推导 没有参数则后边的list可以省略 ^只有声明的时候使用)
使用代码块就是使用函数指针一样 也可以typedef 定义为新的类型
代码块是对象 可以发送消息
Block_release(blockname)
代码块访问变量:
本地变量:代码块生命范围内的变量 代码块会将这个范围内的变量都拷贝保存起来一份
参数变量:就是和函数参数一样
全局变量:也没啥特殊的
__block变量:当想要修改本地变量的值 要用__block 限制:长度可变的数组 含有长度可变数组的结构体 不可以定义为__block类型
多线程
1.简单的多线程实现方式:
performselectorinbackground:withobject: 这种方法通过在后台创建一个线程运行方法 又自己的自动释放池 没有返回值 并且至多拥有一个参数
这种方式实现的多线程 当线程结束时会释放自动释放池 但是不会通知你
2.调度队列
连续队列:遵循FIFO 不会产生死锁
并发队列:遵顼FIFO 但是队列中的多个任务可以同时执行
主队列:程序的主线程相关
dispatch_retain dispatch_release 用来管理队列的引用计数 但是只能修改自己创建的队列 不能修改系统创建的队列
队列上下文:其实就是调用系统函数 将一些数据关联到队列上 关联对象的内存管理由你来处理
清理函数:当对象不在需要设备上下文的时候 让其调用清理函数 将设备上下文对象清理 (类似于dealloc)
__bridge_transfer:将对象内存管理由全局释放池转变为我们的函数 当函数结束时 自动释放池会将这个对象的引用计数-1
——bridge:通知arc这个对象内存由系统管理
3.添加任务
同步添加:需要等待前边的任务执行完 它才执行
异步添加:不会等待 执行后立刻返回
参数为:队列名 函数指针对象/代码块对象
dispatch_sync_f 添加同步任务(函数形式)
dispatch_async_f
dispatch_sync 添加同步任务(代码块形式)
dispatch_async