1
我試圖使用NSOperation和完成塊獲取遠程網站圖像。本質上,接收對象(視圖控制器)將調用SGImageManager的fetchImageWithUrlString:completionBlock方法,該方法反過來將設置具有它自己的完成塊的SGFetchImageOperation。最後,操作調用完成塊中的完成塊。在iOS中,使用NSOperation與嵌套完成塊導致重複EXC_BAD_ACCESS
該應用程序不會崩潰,但它在指示的行上和檢查器中反覆斷開,存在與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];
}
第一件事您的當前屬性重命名爲,在塊使用自我是錯誤的,創建弱指針自我,其他明智它會創建擋週期.. 。? –
如果應用程序沒有崩潰,並在一個點打破..!你確定沒有中斷點嗎?哪些使應用程序打破點擊後播放按鈕它開始再次運行? –