gpt4 book ai didi

iphone - 将 NSOperation 添加到 NSOperationQueue 时出现 EXC_BAD_ACCESS

转载 作者:行者123 更新时间:2023-11-28 22:48:25 26 4
gpt4 key购买 nike

我已经为这个错误坐了几个小时了。我在线上收到 EXC_BAD_ACCESS(代码=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 方法。

我现在不知道该怎么办。如果你不知道那个错误的原因,我怎样才能更准确地分析情况? (Product > Analyze 不会提示该位置的潜在泄漏)。

感谢您的帮助。

最佳答案

哦,伙计……这花了一段时间,但最后我知道问题出在 for 循环中。

声明

self.downloadOP = [[[GTMDownloadOperation alloc]initWithImage:tmpImg]autorelease];

在每次迭代中一次又一次地访问变量 downloadOP。使用相同的 NSOperation 似乎会使它的 retainCount 崩溃。

我改成了

GTMDownloadOperation *downloadOP = [[GTMDownloadOperation alloc]initWithImage:tmpImg];

而且它没有错误。傻我。

关于iphone - 将 NSOperation 添加到 NSOperationQueue 时出现 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12580089/

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