我有以下代码:
- (void)downloadPressed:(id)sender {
[_download startDownloadWithParser:^id(NSData *rawData) {
NSString* downloadName = [[_download url] lastPathComponent];
// ... more code
}];
[self reloadView];
}
此代码位于UITableViewCell
内,众所周知,重用机制应该特别注意..
我的问题,清洁&简单
如果我在块之后添加以下代码行:
_download = nil;
块内的_download
变量也没有了!我希望它能得到副本,怎么样?
答案 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
会影响块,已经给出了解决方案。