将实例变量复制到Objective-C块中

时间:2012-07-31 13:25:39

标签: objective-c objective-c-blocks instance-variables

我有以下代码:

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

        // ... more code
    }];

    [self reloadView];
}

此代码位于UITableViewCell内,众所周知,重用机制应该特别注意..

我的问题,清洁&简单

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

_download = nil;

块内的_download变量也没有了!我希望它能得到副本,怎么样?

2 个答案:

答案 0 :(得分:6)

如果您希望您的块获取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的所有后续更改对您的块不可见。

答案 1 :(得分:3)

块中的

_download被解释为self->_download,因此块捕获self而不是download

这解释了为什么设置_download = nil会影响块,已经给出了解决方案。