4

私は次のコードを持っています:

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

        // ... more code
    }];

    [self reloadView];
}

このコードはの中にありUITableViewCell、ご存知のとおり、再利用メカニズムには特別な注意を払う必要があります。

私の質問、クリーン&シンプル:

ブロックの後に次のコード行を追加すると、次のようになります。

_download = nil;

ブロック内の_download変数もnil'dになります!代わりにコピーを取得したいのですが、どうすればよいですか?

4

2 に答える 2

7

ブロックでivarのコピーを取得する場合は、ブロックからローカル変数を作成し、ivarの代わりにブロック内でそのローカルを使用します。

-(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ブロックから見えないようにします。

于 2012-07-31T13:30:37.023 に答える
3

_downloadブロック内はとして解釈されるself->_downloadため、ブロックはキャプチャselfし、ではありませんdownload

これは、設定がブロックに影響を与える理由を説明し _download = nilています。解決策はすでに示されています。

于 2012-07-31T15:03:34.297 に答える