防止objc块复制属性

时间:2013-03-14 22:14:04

标签: iphone ios objective-c ios6 objective-c-blocks

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

- (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做任何事情,只是调用此函数将其放入我的缓存中。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-1)

您可能希望对self使用弱引用来阻止保留周期:

- (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];
                 }];
}