私は今、このエラーに何時間も座っています。次の行に 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 ではありません)。
奇妙なことに、このクラスには、downloadQueue および downloadOP と同じ方法で宣言および処理される他の NSOperations を持つ 2 番目の NSOperationQueue があります。そして、それらは完璧に機能します。
はい、GTMDownloadOperation は NSOperation の子クラスであり、-(void)main メソッドがあります。
私は今何をすべきかわかりません。そのエラーの理由がわからない場合、状況をより正確に分析するにはどうすればよいですか? (Product > Analyze は、その位置での潜在的なリークについて文句を言いません)。
ご協力いただきありがとうございます。