1

ベータ テストの前に Instruments でテストしている iPad アプリがあります。1 つを除いてすべてのメモリ リークを取り除きましたが、それに関する情報は見つかりません。私のコードでは、NSDecimalNumberPlaceHolder のインスタンスであるリーク オブジェクトについて言及していないため、どうすればよいか困惑しています。

確かに私は NSDecimalNumber を使用しています。ユーザー操作ごとに 2 つの小数を作成し、アプリのサイクルを実行するたびに (2 つの NSDecimalNumbers に対して何らかの数学操作を実行します)、この NSDecimalPlaceHolder のインスタンスを 4 つ生成します。作成方法がわからないため、これらの 16 個の btye リークが何度も発生しないように解放または割り当て解除する方法がわかりません。

これらが実際にはリークではない可能性はありますか?

XCode Analyzer を実行しましたが、問題は報告されません。

私がやっていることはこれです:

コントローラーからモデル (analyzer_) に ​​10 進数を送信し、モデル (analyzer_) が操作を実行して結果を返します。

[[self analyzer_] setOperand:[NSDecimalNumber decimalNumberWithString:anotherStringValue]];

setOperand メソッドは次のようになります。

-(void)setOperand:(NSDecimalNumber*)theOperand
{
NSLog(@"setOperand called");
operand_ = theOperand;
//[operand_ retain];    

}

operand_ 「どこか」を保持しないと、BAD_ACCESS クラッシュが発生することに注意してください。私は現在、オペランドと以前に提供されたオペランド (queuedOperand_) が操作される場所でそれを保持し、後で解放します。例えば:

{
[self performQueuedOperation];
queuedOperation_ = operation;
queuedOperand_ = operand_;
}   

return operand_;
[operand_ release];

ここで、 performQueuedOperation は次のとおりです。

-(void)performQueuedOperation
{
   [operand_ retain];
   if ([@"+" isEqualToString:queuedOperation_]) 
   {
    @try
    {
    operand_ = [queuedOperand_ decimalNumberByAdding:operand_];
    }
    @catch (NSException *NSDecimalNumberOverFlowException)
    {
    //viewController will send decimal point error message
    }
   <etc for the other operations>
}

これが明確でない場合はお知らせください。ありがとう。

4

1 に答える 1

1

Instruments で Heapshot を試してください。次を参照してください

使用されなくなったメモリへのポインタがまだある場合、それはリークではなく、失われたメモリです。私は Heapshot を頻繁に使用していますが、非常にうまく機能します。また、割り当てツールで参照カウントの記録をオンにして、ドリルダウンします。スクリーンショットは次のとおりです。ここに画像の説明を入力

于 2011-10-03T02:03:07.950 に答える