2013-03-14 66 views
2

我有一个分页的UITableView一次只显示一个项目。每个项目都是从互联网上获取的图片。我下载使用异步块放在图片:防止objc块的抄袭

- (void)downloadImageForPost:(GifPost *)p atIndex:(NSInteger)index 
{ 
    [APIDownloader imageForSource:p.src 
        completion:^(NSData *data, NSError *error) { 
         if (self.currentIndex != index) 
         return; 

         [self.tableView 
         reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:index 
                    inSection:0]] 
           withRowAnimation:UITableViewRowAnimationNone]; 
        }]; 
} 

问题出在哪里if (self.currentIndex != index)self.currentIndex外块修改。说我把这个功能称为我的所有图像和那个self.currentIndex = 0。如果我滚动到另一个索引,因为在执行时保存了self.currentIndex,我的if条件不起作用。

有没有办法阻止块复制指定的变量。如果没有,我该怎么做才能有正确的行为? PS:我没有做任何与data,只是调用这个函数把它放到我的缓存中。

+5

'self.currentIndex'已经将*不*被捕获。这是一个方法调用,而不是局部变量。另一方面,“索引”将在块创建时捕获。 – 2013-03-14 22:17:31

+0

你是对的,问题不是来自这里,而是我更新'self.currentIndex'的方式。感谢您让我走上正轨! – Lowip 2013-03-14 22:20:15

+0

即使您正在使用像_currentIndex这样的实例变量,它仍然不会被捕获,因为它不是局部变量。捕获的局部变量将是“self”。 – newacct 2013-03-15 03:02:23

回答

0

正如Andrew Madsen所说,self.currentIndex是一个方法调用。我的错误来自我更新的地方self.currentIndex

-1

您可能需要使用弱引用自我,防止保留周期:

- (void)downloadImageForPost:(GifPost *)p atIndex:(NSInteger)index 
{ 
    __weak ClassForSelf *weakSelf = self; 
    [APIDownloader imageForSource:p.src 
       completion:^(NSData *data, NSError *error) { 
        if (weakSelf.currentIndex != index) 
        return; 

        [weakSelf.tableView 
        reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:index 
                   inSection:0]] 
          withRowAnimation:UITableViewRowAnimationNone]; 
       }]; 
} 
+0

你确定吗?当我试图修改一个对象本身而不是它的一个属性时,编译器只会发出警告。 – Lowip 2013-03-14 22:53:46

+0

您的执行过程中可能不会出现崩溃或泄漏,但绝对不会出现我的错误和参考文件 – 2013-03-14 23:31:44

+2

原始文件中没有保留循环,因为'self'不保留​​该块。 – ughoavgfhw 2013-03-15 00:21:14