0

メモリ割り当てに問題があります(とにかくリークしません)。

私のプログラムには、、 、およびを含むWindowカスタムのカスタムがあります。1 秒ごとにusingの値をプログラムで更新するとします。ViewTextFieldImageViewShadowTextField[myTextField setStringValue:@"actual string"]

明らかに、TextField が変更されるたびに、ビューが再描画されます。

アクティビティ モニターを見ると、TextField が更新されるたびにビューが再描画され、割り当てられたメモリが増加することがわかります。ImageView は変更されるべきではありません。 で行をコメントするとsetStringValue、プログラムはメモリをまったく増やすことなく実行されます。(更新 4 を参照してください。)

Instrumentsはメモリ リークや解放されていないオブジェクトを報告せず、View はautorelease'd.

何が原因でしょうか?

アップデート

実際のコードの簡略版を投稿します。

.h

CustomTextField *myTextField;
int level;

@interface Dummy : NSObject {

NSString *level_string;
NSTimer *timer;

}

@end

.m

@implementation Dummy

- (void)awakeFromNib
{
// ...
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
                                                  target:self 
                                                selector:@selector(changestring:) 
                                                userInfo:nil
                                                 repeats:YES];

// ...

}


-(void)changestring:(NSTimer *)timer
{
        level++;
        level_string = [[NSString alloc] initWithFormat:@"%i",level];
        [myTextField setStringValue:level_string];
        [level_string release];

}

クラスCustomTextFieldはどこですか。NSTextField

追加するものが重要かどうかはわかりませんが、とにかく、カスタム ウィンドウ、カスタム ビュー、およびカスタム テキスト フィールドはinitコード内でプログラムによって定義されており、インターフェイス ビルダーではインスタンス化されません。

更新 2

私は間違っていた!コメントしてもsetStringValue、メモリはまだ増加します..はるかに少ないですが、それでも増加します..奇妙な事実は、いずれにせよ、インスツルメントが「生きているオブジェクト」のサイズを報告することです。これは一定のままであり、リークは報告されていません。

何が起こっている?

更新 3

Instruments のすばらしいヒープショット機能を使用した結果がこれです。

アクティビティ モニターで見られるメモリの増加 (数分後に数千キロバイトのオーダー) はどこから来たのですか?

更新 4

問題の原因はわかったと思いますが、解決できません。

ビューには、TextField、ImageView、および Shadow があります。グリッチなしで画面に正しく表示されるようにするために、 を追加しまし[view setWantsLayer:YES]た。この行にコメントすると、メモリ割り当ての問題は確実に解決されます。

さて、そのコマンドを使用する必要がある限り、どうすればよいでしょうか? コア アニメーションに関連するものをリリースすることになっていますか? Core Animation に関連するコマンドは、上記の 1 つだけであることに注意してください。

4

2 に答える 2

2

セッション311-WWDC10セッションビデオの機器を使用した高度なメモリ分析をご覧ください。これらのビデオをダウンロードする方法はここにあります。

放棄されたメモリが表示されているか、キャッシュが実行されている可能性があります。シミュレータでメモリ不足の警告をトリガーするとどうなりますか?記憶力が低下しますか?

また、Instrumentsのヒープショット機能を使用してみてください。ヒープショットを作成し、文字列を更新して、作成されたオブジェクトを表示します。上記のセッションビデオでは、手順が示されています。

編集:私が忘れたもの:何が起こっているのか理解できず、単純なサンプルアプリケーションでメモリ不足の警告がトリガーされた場合に、メモリ割り当てを解放せずに増やすというこの動作を示すことができる場合は、Appleのbugreporterにバグを報告してこれを送信してください何が起こっているかを示すサンプルプロジェクトとInstrumentsトレースファイル。

EDIT2:この問題がMacOSXにあると仮定して間違っていました。同じ原則がMacOSXアプリケーションにも当てはまります。Cocoaのメモリ管理は、iPhoneとMacでほぼ同じです。最大の違いは、Macではガベージコレクションを利用できることです。もちろん、Macではメモリ不足の警告はないので、それを省いてください。

于 2011-02-20T22:18:51.147 に答える
0

CustomTextFieldのsetStringValue:は何をしますか?私の推測では、セッターで古い値を解放せずに、渡された文字列を保持していると思います。

于 2011-02-21T11:40:34.410 に答える