gpt4 book ai didi

iphone - iOS 4 GCD 问题

转载 作者:太空狗 更新时间:2023-10-30 03:40:34 27 4
gpt4 key购买 nike

我看过 WWDC 2010 的一些演示文稿,还阅读了大部分关于 block 和并发的文档,并且有几个关于在 Grand Central Dispatch 中使用带串行队列的 block 的问题。我有一个 iOS 4 项目,它有一个 ScrollView 和一个图像信息字典——图像的 url 等等。我想使用 GCD 和 block 来下载图像并将它们放在我的 ScrollView 中,这样就不会阻塞主线程。我编写了以下似乎有效的代码:

for (NSDictionary* dict in images)
{
dispatch_async(image_queue, ^{

NSString* urlString = [dict objectForKey:@"url"];
NSURL* url = [NSURL URLWithString:urlString];
NSData* imageData = [[NSData alloc] initWithContentsOfURL:url];
UIImage* image = [UIImage imageWithData:imageData];
UIImageView* imageView = // initialize imageView with image;

dispatch_async(dispatch_get_main_queue(), ^{
[self.scrollView addSubview:imageView];
});
[imageData release];
});
}

我有两个问题:

  1. 根据并发指南,我不应从非标量类型的封闭范围中捕获变量 - 在我的代码中,我捕获的字典是一个 NSDictionary* 对象。如果不允许我捕获它,我应该如何编写代码? block 是否只捕获封闭作用域中实际使用的变量?

  2. 如果我在通过串行调度队列获取所有图像之前离开当前 ViewController,会发生什么情况?我不认为他们知道创建它们的 ViewController 已经消失,所以当他们执行完成处理程序时会发生什么,我将 ImageView 插入到主线程上的 ScrollView 中?它会导致错误还是什么?当我的 ViewController 消失时,如何取消串行队列上的任何剩余操作?

最好的问候,

最佳答案

  1. 虽然这是个小问题,但这对于理解并发指南试图告诉您的内容很重要:指针标量类型。因此,您可以随心所欲地捕获 block 内的指针……但是您必须认识到它们指向的内存的生命周期! NSDictionary * 是一种 id,当您在 block 中引用 id 时,运行时负责在 block 被复制时保留 id(这是通过 dispatch_async() 实现的),然后在 block 时释放它本身被释放。是的, block 仅捕获其中引用的变量。

  2. 既然您现在知道异步 block 已经对自身进行了保留,那么应该清楚(呃)(模内存管理错误)您的 ViewController 在该 block 完成之前不能“消失”。所以它不会崩溃——但是你正确地注意到当你实际上不打算再使用结果时你真的想要一种方法来取消这种异步工作。一种简单但有效的模式是在异步 block 的开头进行测试,以检查工作是否仍应完成。

关于iphone - iOS 4 GCD 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3343734/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com