1

の Mac OS X アプリケーションで計測器を実行しましたXcode 4.5NSOperationプロセス キューに追加した後に解放するのを忘れた2 つの依存サブクラスがあります。そのため、キューに追加した直後にリリースしました。アプリケーションはうまく機能します。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の関数で2回目に解放されました。dealloc今、私はサブクラスで[super dealloc]もうオーバーライドしません、そしてそれは働きます。NSOperation

于 2013-01-14T15:33:49.000 に答える
0

私の推測では、割り当てが解除されると、conversionOp はすべての依存関係 (この場合は downloadOp) を解放します。したがって、両方の操作が終了した後に [conversionOp release] を呼び出す (これは、スレッドのスケジュール方法によって異なります) ため、downloadOp を過剰に解放します。

于 2013-01-14T12:39:37.610 に答える