gpt4 book ai didi

ios - 调试运行到具有保留周期的 block

转载 作者:行者123 更新时间:2023-11-29 12:08:07 26 4
gpt4 key购买 nike

我有问题,我已经知道不能那样使用,但我想在这里问的只是解释,而不是如何解决。请注意。

我正在使用 UIImageView+AFNetworking ,我这样调用服务:

UIImageView* imageView = [[UIImageView alloc]init];
[imageView setImageWithURLRequest:request placeholderImage:nil success:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, UIImage * _Nonnull image) {
NSLog(@"In here.");
} failure:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, NSError * _Nonnull error) {
completionBlock(nil, error);
}];

这种情况下,不会遇到NSLog(@"In here.") .我们可以看到imageView发行了。但是当我这样使用时:

UIImageView* imageView = [[UIImageView alloc]init];
[imageView setImageWithURLRequest:request placeholderImage:nil success:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, UIImage * _Nonnull image) {
NSLog(@"In here.");
imageView.image = image; /* I know this will make retain cycle. but don't care, just need explanation why? */
} failure:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, NSError * _Nonnull error) {
completionBlock(nil, error);
}];

现在调试运行到NSLog(@"In here.") , imageView someshow 仍然保留,请有人告诉我为什么?

注意:请不要给出如何修复和正确使用方法的解决方案,只需解释为什么?

=====

感谢大家的支持,我终于明白了。

在第一段代码中,imageViewreleasesetImageWithURLRequest 的末尾, 所以它不会调用 success block ,这就是为什么 NSLog(@"In here.")不被调用。

在第二个中,通过设置 imageView.image = image , 将生成保留循环,即 imageView现在持有对success的强烈引用 block ,然后在 block 内,我调用 imageView使用,所以现在 success block 持有对 imageView 的强烈引用,这使得保留周期和现在imageView不会被释放。因此,进入NSLog(@"In here.") .

最佳答案

我假设你的代码看起来像这样并且在 ARC 下运行

- (void) yourMethod {
UIImageView* imageView = [[UIImageView alloc]init];
[imageView setImageWithURLRequest:request placeholderImage:nil success:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, UIImage * _Nonnull image) {
NSLog(@"In here.");
} failure:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, NSError * _Nonnull error) {
completionBlock(nil, error);
}];
}

在 ARC 下,当控制到达 yourMethod 的末尾时,imageView 将被释放。

通过添加:

imageView.image = image;

success block 保留对 imageView 的引用,这就是您看到“在这里”消息的原因(imageView 将被释放在 success block 执行结束时)。尝试将 imageView 声明为您的类的一个强大属性,您应该得到“In here”而不将此行添加到 success block 。

关于ios - 调试运行到具有保留周期的 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34354379/

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