2014-01-14 40 views
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]; 
} 
+0

第一件事您的當前屬性重命名爲,在塊使用自我是錯誤的,創建弱指針自我,其他明智它會創建擋週期.. 。? –

+0

如果應用程序沒有崩潰,並在一個點打破..!你確定沒有中斷點嗎?哪些使應用程序打破點擊後播放按鈕它開始再次運行? –

回答

3

我覺得這裏的問題是您要添加一個名爲completionBlock屬性的NSOperation的子類,已經爲completionBlock定義的方法。

你可以擺脫你的子類的屬性,並使用NSOperation的-setCompletionBlock:方法。

或者,你可以像我想說SGCompletionBlock