1

我在我的 Mac OS X 应用程序上以Xcode 4.5. 我有两个NSOperation依赖子类,在将它们添加到进程队列后忘记释放它们。所以我在将它们添加到队列后就释放了它们。该应用程序运行良好。我在 Instruments 上对其进行了分析,但它崩溃了。

processQueue = [[NSOperationQueue alloc] init];
NSUInteger max = [[NSUserDefaults standardUserDefaults] integerForKey:@"jobsKey"];
processQueue.maxConcurrentOperationCount = max;
GeocacheDownloadOperation * downloadOp = [[GeocacheDownloadOperation alloc]  initWithGeocache:cache InPath:directoryPath withDelegate:self];        
GeocacheJPGConversionOperation * conversionOp = [[GeocacheJPGConversionOperation alloc] initWithCache:cache WithPath:directoryPath WithDelegate:self];

[conversionOp addDependency:downloadOp];     
[processQueue addOperation:downloadOp];
[processQueue addOperation:conversionOp];

[downloadOp release];
[conversionOp release]; //This line makes Instruments crash

Instruments当我想释放最后一个操作时崩溃(参见代码),但应用程序似乎运行良好。

有人有建议吗?是仪器错误还是我编码错误?

4

2 回答 2

0

我发现了错误,但我无法解释为什么它是单独工作而不是在 Instruments 中工作。我在子类中使用了一个已发布的变量,这是我在 NSOperation 子类NSOperation的函数中第二次发布的。dealloc现在,我[super dealloc]不再在NSOperation子类中覆盖它并且它可以工作。

于 2013-01-14T15:33:49.000 回答
0

我的猜测是,conversionOp 在释放时会释放每个依赖项(在这种情况下是 downloadOp)。所以你在两个操作完成后调用[conversionOp release](这取决于线程的调度方式),所以你过度释放了downloadOp。

于 2013-01-14T12:39:37.610 回答