2013-03-14 37 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