小编stw*_*rks的帖子

块和变量

目前我正在探索块机会,我读了十多次苹果文档)但我无法理解博客示例和代码中的块行为.我知道__block修饰符.所以请看几个我的例子,并说明它为什么起作用:

1)不工作.需要__block,因为我想修改对象.并且自我保留(正确吗?)并且在博客中我被保留自我循环吓坏了.是吗?

NSDictionary *result = nil;
dispatch_async(queue, ^{
    result = [self sendRequest:apiRequest];
});
Run Code Online (Sandbox Code Playgroud)

2)不工作.我不了解dispatch_async的变量范围(dispatch_get_main_queue(),^ {});. 它是否在主线程中看到所有局部变量,或者它是与主线程分开的块,但在主线程中是否已被删除?像dispatch_async(dispatch_get_main_queue()^ {}); 复制dispatch_async(queue,^ {})中的所有局部变量; 并将信号量切换到主线程.

NSDictionary *result = nil;
dispatch_async(queue, ^{
    NSDictionary *data = [self sendRequest:apiRequest];
    dispatch_async(dispatch_get_main_queue(), ^{
        result=[data retain];
    });
}); 
Run Code Online (Sandbox Code Playgroud)

3)博客和斯坦福的课程中的例子特别混淆了我,因为他们的工作.

- (void)viewWillAppear:(BOOL)animated
{
    dispatch_queue_t downloadQueue = dispatch_queue_create(“image downloader”, NULL);
    dispatch_async(downloadQueue, ^{
         NSData *imageData = [NSData dataWithContentsOfURL:networkURL];
         dispatch_async(dispatch_get_main_queue(), ^{
             UIImage *image = [UIImage imageWithData:imageData];
             self.imageView.image = image;
             self.imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);
?             self.scrollView.contentSize = image.size;
         });
    });
    dispatch_release(downloadQueue);
}
Run Code Online (Sandbox Code Playgroud)

我不明白,因为首先他们在文章和课程中没有提到关于__block的自我,第二个代码修改了变量,但是通过属性和编译器并不发誓变量不可分配和属性更改引用,而不是值.最后它有效.提前致谢.

objective-c objective-c-blocks

4
推荐指数
1
解决办法
5618
查看次数

标签 统计

objective-c ×1

objective-c-blocks ×1