我已经坐在这个错误上几个小时了。我得到一个 EXC_BAD_ACCESS (code=2) 就行了:
[self.downloadQueue addOperation:self.downloadOP];
我知道它必须与内存冲突有关,但我就是找不到问题所在。管理 OperationQueues 的类是单例,但我认为这不是问题。
这是我的 .h 文件的缩短版本:
@interface GTMConnectionManager : NSObject{
}
@property (retain) GTMDownloadOperation *downloadOP;
@property (retain) NSOperationQueue *downloadQueue;
// it doesn't make a difference if I add 'nonatomic' to these properties
+ (GTMConnectionManager *)sharedConnectionManager;
-(void)downloadImageData:(NSMutableArray*)p_images andController:(UIViewController*)p_resultsController;
@end
.m 文件的重要部分:
#import "GTMConnectionManager.h"
@implementation GTMConnectionManager
@synthesize downloadOP, downloadQueue;
+ (GTMConnectionManager *)sharedConnectionManager
{
static GTMConnectionManager * instance = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
instance = [[super allocWithZone:nil] init];
});
return instance;
}
-(void)downloadImageData:(NSMutableArray*)p_images andController:(GTMResultsListViewController*)p_resultsController{
self.resultsController = p_resultsController;
[self.downloadQueue setMaxConcurrentOperationCount:2];
self.downloadQueue = [[[NSOperationQueue alloc]init]autorelease];
// it doesn't make a difference if I do this with or without 'autorelease'
for (int i = 0; i < [p_images count]; i++) {
GTMGeoImage *tmpImg = [p_images objectAtIndex:i];
self.downloadOP = [[[GTMDownloadOperation alloc]initWithImage:tmpImg]autorelease];
[self.downloadQueue addOperation:self.downloadOP]; //Here's the error
}
}
当我在错误行之前添加断点时,self.downloadQueue 和 self.downloadOP 都正确保留(不是 nil)。
奇怪的是:在这个类中,我有第二个 NSOperationQueue 和其他 NSOperations,它们的声明和处理方式与 downloadQueue 和 downloadOP 相同。他们完美地工作。
是的,GTMDownloadOperation 是 NSOperation 的子类,并且有一个 -(void)main 方法。
我不知道现在该怎么办。如果您不知道该错误的原因,我该如何更准确地分析情况?(产品 > 分析不会抱怨该位置的潜在泄漏)。
谢谢你的帮助。