gpt4 book ai didi

ios - 在 iOS 中,使用带有嵌套完成 block 的 NSOperation 会导致重复的 EXC_BAD_ACCESS

转载 作者:行者123 更新时间:2023-12-01 19:03:49 26 4
gpt4 key购买 nike

我正在尝试使用 NSOperation 和完成 block 获取远程 Web 图像。本质上,接收对象( View Controller )将调用 SGImageManager 的 fetchImageWithUrlString:completionBlock 方法,该方法又会设置一个具有自己的完成 block 的 SGFetchImageOperation。最后,该操作调用完成 block 内的完成 block 。

该应用程序没有崩溃,但它在指示的行上反复中断,并且在检查器中,存在与 operationImage 和 operationUrlString 关联的奇怪值。我不确定如何调试它。我唯一的理论是由于某种原因发生了循环调用。

//SGFetchImageOperation.h
typedef void(^SGFetchImageCompletionBlock)(UIImage *image, NSString *urlString);

@interface SGFetchImageOperation : NSOperation
@property (nonatomic, strong) NSString *urlString;
@property (copy) SGFetchImageCompletionBlock completionBlock;
@end


//SGFetchImageOperation.m
#import "SGFetchImageOperation.h"

@implementation SGFetchImageOperation

- (void)main {
@autoreleasepool {
if (self.isCancelled) {
return;
}

UIImage *image = [self image];

if (self.isCancelled) {
return;
}

if(self.completionBlock && self.urlString && image) {
dispatch_async(dispatch_get_main_queue(), ^{
self.completionBlock(image, self.urlString);
});
}
}
}

- (UIImage *)image{
UIImage *image;
if(self.urlString){
NSURL *url = [NSURL URLWithString:self.urlString];
NSError *error = nil;
NSData *data = [NSData dataWithContentsOfURL:url options:NSDataReadingMappedAlways error:&error];
if (data) {
image = [UIImage imageWithData:data];
} else {
NSLog(@"Error downloading image. %@", error.localizedDescription);
}
}
return image;
}

@end



//SGImageManager.h
#import "SGFetchImageOperation.h"

@interface SGImageManager : NSObject
- (void)fetchImageWithUrlString:(NSString *)urlString completionBlock:(SGFetchImageCompletionBlock)completionBlock;
@end


//SGImageManager.m
- (void)fetchImageWithUrlString:(NSString *)urlString completionBlock:(SGFetchImageCompletionBlock)completionBlock {
SGFetchImageOperation *operation = [SGFetchImageOperation new];
operation.urlString = urlString;

//Keeps breaking on this line with "Thread x: EXC_BAD_ACCESS (code=2, address=0x1)", but doesn't seem to crash.
operation.completionBlock = ^(UIImage *operationImage, NSString *operationUrlString){

completionBlock(operationImage, operationUrlString);
};
[self.queue addOperation:operation];
}

最佳答案

我认为这里的问题是您要添加一个名为 completionBlock 的属性。到 NSOperation 的子类,它已经为 completionBlock 定义了方法.

您可以摆脱子类的属性,只需使用 NSOperation 的 -setCompletionBlock:方法。

或者,您可以将当前属性重命名为 SGCompletionBlock

关于ios - 在 iOS 中,使用带有嵌套完成 block 的 NSOperation 会导致重复的 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21114947/

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