メモリ割り当てに問題があります(とにかくリークしません)。
私のプログラムには、、 、およびを含むWindow
カスタムのカスタムがあります。1 秒ごとにusingの値をプログラムで更新するとします。View
TextField
ImageView
Shadow
TextField
[myTextField setStringValue:@"actual string"]
明らかに、TextField が変更されるたびに、ビューが再描画されます。
アクティビティ モニターを見ると、TextField が更新されるたびにビューが再描画され、割り当てられたメモリが増加することがわかります。ImageView は変更されるべきではありません。
で行をコメントすると(更新 4 を参照してください。)setStringValue
、プログラムはメモリをまったく増やすことなく実行されます。
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 つだけであることに注意してください。