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

Maz*_*yod 4 objective-c instance-variables objective-c-blocks

我有以下代码:

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

        // ... more code
    }];

    [self reloadView];
}
Run Code Online (Sandbox Code Playgroud)

这段代码位于一个内部UITableViewCell,众所周知,重用机制应该特别注意..

我的问题,简洁明了:

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

_download = nil;
Run Code Online (Sandbox Code Playgroud)

_download区块内的变量也被nil'd!我希望得到一份副本,怎么样?

das*_*ght 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];
}
Run Code Online (Sandbox Code Playgroud)

该块将在创建块对象时捕获该局部变量的值,使所有后续更改对_download块不可见.