4

我有以下代码:

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

        // ... more code
    }];

    [self reloadView];
}

这段代码位于 aUITableViewCell中,众所周知,重用机制应该特别注意..

我的问题,干净简单:

如果我在块之后添加以下代码行:

_download = nil;

块内的_download变量也为零!我希望它得到一个副本,如何?

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 回答