- 分两种情况:手动干预释放时机、系统自动去释放
- 手动干预释放时机:指定autoreleasepool就是所谓的:当前作用域大括号结束时就立即释放
- 系统自动去释放:不手动指定autoreleasepool,Autorelease对象会在当前的 runloop 迭代结释放 #### 苹果为什么要废弃dispatch_get_current_queue • 容易误用造成死锁 如何用GCD同步若干个异步调用?(如根据若干个url异步加载多张图片,然后在都下载完成后合成一张整图) • 必须是并发队列才起作用 • 需求分析 ○ 首先,分别异步执行2个耗时的操作 ○ 其次,等2个异步操作都执行完毕后,再回到主线程执行一些操作 • 使用队列组实现上面的需求 // 创建队列组 dispatch_group_t group = dispatch_group_create(); // 获取全局并发队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 往队列组中添加耗时操作 dispatch_group_async(group, queue, ^{ // 执行耗时的异步操作1 }); // 往队列组中添加耗时操作 dispatch_group_async(group, queue, ^{ // 执行耗时的异步操作2 }); // 当并发队列组中的任务执行完毕后才会执行这里的代码 dispatch_group_notify(group, queue, ^{ // 如果这里还有基于上面两个任务的结果继续执行一些代码,建议还是放到子线程中,等代码执行完毕后在回到主线程 // 回到主线程 dispatch_async(group, dispatch_get_main_queue(), ^{ // 执行相关代码… }); }); #### dispatch_barrier_async的作用是什么 • 函数定义 dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block); • 必须是并发队列,要是串行队列,这个函数就没啥意义了 • 注意:这个函数的第一个参数queue不能是全局的并发队列 • 作用:在它前面的任务执行结束后它才执行,在它后面的任务等它执行完成后才会执 • 示例代码 -(void)barrier { dispatch_queue_t queue = dispatch_queue_create(“12342234″, DISPATCH_QUEUE_CONCURRENT); dispatch_async(queue, ^{ NSLog(@”—-1—–%@”, NSThread currentThread); }); dispatch_async(queue, ^{ NSLog(@”—-2—–%@”, NSThread currentThread); }); // 在它前面的任务执行结束后它才执行,在它后面的任务等它执行完成后才会执行 dispatch_barrier_async(queue, ^{ NSLog(@”—-barrier—–%@”, NSThread currentThread); }); dispatch_async(queue, ^{ NSLog(@”—-3—–%@”, NSThread currentThread); }); dispatch_async(queue, ^{ NSLog(@”—-4—–%@”, NSThread currentThread); }); } #### 以下代码运行结果如何?
- (void)viewDidLoad { super viewDidLoad; NSLog(@”1″); dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@”2″); }); NSLog(@”3″); } • 答案:主线程死锁
不手动指定autoreleasepool的前提下,一个autorealese对象在什么时刻释放?

阅读 132
收藏 0
点赞 0
评论 0
评论列表
文章目录