0

私が作成したクラスのinitメソッドのリークに問題があります。それをシンプルに保つために、私は次の(簡体字)問題を抱えている:objective-cクラスのinitメソッドのメモリリーク

  • のViewControllerは、文字列に初期化
  • AnimationDataクラスのインスタンスを初期化
  • ClipDataクラスのインスタンスを初期化

ViewController:

myClipData = [[ClipData alloc] init]; 

ClipData:

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

    return self; 
} 

AnimationData:

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

    return self; 
} 

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

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

おかげで、あなたはanimDataを解放されることはありません
Duncs

答えて

1

。あなたのクラスにdeallocを追加する必要があります。

- (void)dealloc { 
    [animData release]; 

    [super dealloc]; 
} 

は同様に、あなたが同様のdeallocAnimationDataを追加する必要があります。

関連するノートでは、-[AnimationData init]で作成された文字列を保持し、後で解放する必要があります。あなたが今やっていることは本質的には何もしていません。

+0

実際には、ココアのアン実装の詳細のおかげで、彼は '[NSStringの文字列]'メソッドを持つ幸運です。 – JeremyP

+0

@JeremyP:そうであれば、それに頼るべき行動ではありません。 –

+0

いいえ、私はあなたがそれに頼るべきであることを暗示するつもりはありませんでした。私はCocoaの現在の実装を使用して、TheDuncsが実際にガベージ文字列を実際に表示しない理由を説明するポイントを追加しました。 – JeremyP

0

allocをお持ちの場合は、リリースも必要です。

また、下のメンバーではなくプロパティにアクセスするために、自分でプロパティを参照する必要があります。

だから、あなたが本当に実行する必要があります。

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; 
+0

実際には、http://stackoverflow.com/questions/192721/why-shouldnt-i-use-objective-c-2-0-accessors-in-init-dealloc –

+0

Mongus - ありがとうございます。新しいClipDataをオブジェクトに割り当ててオブジェクトを解放する利点を理解していません。確かに私はself.myClipData = [[ClipData alloc] init]を呼び出すことができます。 ???私は追加することを忘れてしまったdeallocメソッドを使ってリークを解決することができましたが、ポイントは最初にウィリアムに行くことになります。本当にありがとう! – theDuncs

+0

allocはオブジェクトに1の参照カウントを与えます。オブジェクトを保持するプロパティに割り当てると、カウントは2に増加します。したがって、カウントを1に戻すリリースが必要です。あなたの質問では、プロパティを介して割り当てることで、余分な保持を避けることができます。 –

関連する問題