2012-07-31 19 views
4

我有以下代碼:複製實例變量爲一個Objective-C座

- (void)downloadPressed:(id)sender { 
    [_download startDownloadWithParser:^id(NSData *rawData) { 
     NSString* downloadName = [[_download url] lastPathComponent]; 

     // ... more code 
    }]; 

    [self reloadView]; 
} 

此代碼位於UITableViewCell裏面,因爲我們都知道,重用機制應採取非常特別說明的..

我的問題,清潔&簡單:

如果我添加以下代碼行後擋:

_download = nil; 

該塊內的_download變量也被忽略!我希望它能得到一份副本,怎麼樣?

+0

從[文檔](https://developer.apple.com/library/ios/documentation/cocoa/conceptual/Blocks/Articles/bxVariables.html):**在方法實現中,塊可以引用Objective- C實例變量。** – cprcrack 2013-10-29 22:08:15

回答

6

如果您希望您的塊,讓您伊娃的副本,從它讓一個局部變量,並使用當地的塊,而不是伊娃內:

-(void)downloadPressed:(id)sender { 
    MyDownload *tmp = _download; // Make an independent pointer 
    [tmp startDownloadWithParser:^id(NSData *rawData) { // Use the local 
     NSString* downloadName = [[tmp url] lastPathComponent]; 
     // ... more code 
    }]; 
    [self reloadView]; 
} 

塊將捕獲值在塊對象創建時該局部變量的所有後續更改,使_download對塊不可見。

+0

哈,非常漂亮..沒有出現在我身上。謝謝。 – Mazyod 2012-07-31 13:44:28

+0

現在不應'MyDownload * tmp = _download;'帶有'__block'前綴? – Craimasjien 2014-06-18 10:33:55

+0

@Bryan只有塊內的代碼改變'tmp'引用的對象時,你才需要'__block'。 – dasblinkenlight 2014-06-18 11:09:31

3

_download在該塊中被解釋爲self->_download,因此該塊捕獲self而不是download

這解釋了爲什麼設置_download = nil影響塊,解決方案已經給出。

+0

這非常有用!然而,它掩蓋了我對'__block'說明符的理解。我認爲這是允許這種變化的原因嗎? – Mazyod 2012-07-31 21:03:24

+1

'self'在塊中仍然是不可變的,但這隻適用於指針。它不會阻止修改「self - > _ download」。 – 2012-07-31 21:08:16