gpt4 book ai didi

objective-c - 不总是在 block 中捕获 self (保留周期)?

转载 作者:太空狗 更新时间:2023-10-30 03:44:32 24 4
gpt4 key购买 nike

以下代码来自Apple提供的LazyTableImages示例代码(source here)。

在他们的完成 block 中,他们有一个对 self 的引用,这应该会导致一个保留周期......但是我在 Xcode 中没有收到警告,而在我的类似代码中我会收到警告。

这是正确的吗?

也许我忽略了其中的一个微妙之处。

- (void)startIconDownload:(AppRecord *)appRecord forIndexPath:(NSIndexPath *)indexPath
{
IconDownloader *iconDownloader = [self.imageDownloadsInProgress objectForKey:indexPath];
if (iconDownloader == nil)
{
iconDownloader = [[IconDownloader alloc] init];
iconDownloader.appRecord = appRecord;
[iconDownloader setCompletionHandler:^{

UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

// Display the newly loaded image
cell.imageView.image = appRecord.appIcon;

// Remove the IconDownloader from the in progress list.
// This will result in it being deallocated.
[self.imageDownloadsInProgress removeObjectForKey:indexPath];

}];
[self.imageDownloadsInProgress setObject:iconDownloader forKey:indexPath];
[iconDownloader startDownload];
}
}

最佳答案

您认为您看到的保留周期是因为该对象将下载器保存在字典中。

的确, block 中有对 self 的强引用,但是,只要完成处理程序始终运行,下载程序就会从字典中删除。最终这个字典将是空的,这意味着将没有对象保持在 self 上,因此没有保留循环。

关于objective-c - 不总是在 block 中捕获 self (保留周期)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17901003/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com