1

init作成したクラスのメソッドでリークの問題が発生しています。簡単にするために、次の(単純化された)問題があります。

  • ViewController のインスタンスを初期化します
  • インスタンスを初期化するClipDataクラス
  • 文字列を初期化する AnimationData クラス

ビューコントローラー:

myClipData = [[ClipData alloc] init];

クリップデータ:

- (id)init
{
    self = [super init];
    if (self) {
        animData = [[AnimationData alloc] init];  //LEAK HERE
    }

    return self;
}

アニメーションデータ:

- (id)init
{
    self = [super init];
    if (self) {
        name = [NSString string];
    }

    return self;
}

クラス内のすべてのオブジェクトは として宣言されてい(nonatomic, retain)ます。これを行うと保持カウントが増えることは承知していますが、 ???AnimationDataをリークせずに初期化するにはどうすればよいですか?animData

おそらく非常にばかげた質問なので、どんな助けでも大歓迎です。

ありがとう、
ダンクス

4

2 に答える 2

2

animData をリリースすることはありません。deallocクラスに追加する必要があります:

- (void)dealloc {
  [animData release];

  [super dealloc];
}

dealloc同様に、 に似たものを追加する必要がありますAnimationData

関連する注意事項として、 で作成した文字列を保持し、後で解放する必要があります-[AnimationData init]。現在行っていることは、文字化けしたポインターが残ることを除いて、基本的には何もしません。

于 2012-04-27T10:05:11.453 に答える
0

alloc がある場合は、release も必要です。

基になるメンバーではなくプロパティにアクセスできるように、self を介してプロパティを参照する必要もあります。

だからあなたは本当にすべきです:

ClipData *clip = [[ClipData alloc] init];
self.myClipData = clip;
[clip release];

 if (self) {
        AnimationData *data = [[AnimationData alloc] init]; 
        self.animData = data;  
        [data release];
    }

プロパティを nil に設定して、クラスの dealloc のプロパティも解放してください。

self.myClipData = nil;
self.animData = nil;
于 2012-04-27T10:06:10.177 に答える