不手动指定autoreleasepool的前提下,一个autorealese对象在什么时刻释放?

匿名网友 匿名网友 发布于: 2016-09-01 00:00:00
阅读 132 收藏 0 点赞 0 评论 0

  • 分两种情况:手动干预释放时机、系统自动去释放
  • 手动干预释放时机:指定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″); } • 答案:主线程死锁

评论列表
文章目录