2012-01-25 4 views
3

、私は次のような方法があります。iOS版:ユーティリティクラスでメモリリーク

+ (Division *) getNationalDivision 
{ 
    Division *defaultDivision = [[[Division alloc] init] autorelease]; 
    defaultDivision.Id = 0; 
    defaultDivision.name = @"National"; 

    return defaultDivision; 
} 

を私は私の見解コントローラの一つに、アプリ全体の分裂を保存するために私のアプリデリゲートにallocted部門を持っているI持っている:アプリデリゲートの.mで

@property (nonatomic, retain) Division *currentDivision; 

は私が持っている:私は持っているの.hアプリデリゲートで

appDel.currentDivision = [[Utilities getNationalDivision] retain]; 

currentDivision = [[Division alloc] init]; 

私が分析すると、私は上記の行を指しているオブジェクトの潜在的なリークを取得します。何か案は?もし私が国家部門を保持しないなら、それは働かない。また、メモするだけで、すべて正常に動作します。私はちょうど私が何かを漏らしていないことを確認したい。

+1

currentDivisionはどのように宣言しましたか? – blueberryfields

+0

あなたの 'currentDivision'プロパティが何と定義されているか言及したいかもしれません。私は '保持'を前提としていますか?その場合、ここでの余分な「保持」は、過剰保持の可能性が非常に高い。 '@property'の定義でもっと知ることができます。 –

+0

コードを追加しました。私は – Jesse

答えて

1

あなたのアプリデリゲートにcurrentDivisionというプロパティを宣言する方法を確認してください。それは(あなたがプロパティを使用して割り当てる前に、それを保持しているので、私は、仮定)assignあなたがそれに割り当てられた後、元の値である場合:

currentDivision = [[Division alloc] init]; 

あなたが実行したときにreleasedを取得することはできません。

appDel.currentDivision = [[Utilities getNationalDivision] retain]; 
したがって、アプリケーションデリゲートで作成したオブジェクトはリークします。

手動で解除を行うと、アナライザは不満を保つかどうかを確認:あなたの財産をassignとして宣言された場合には

[app.currentDivision release]; 

これは理にかなっています。

それはretainとして宣言されている場合は、その障害がライン上にある:

手動で保持を行うべきではありません
appDel.currentDivision = [[Utilities getNationalDivision] retain]; 

2

保持は、合成されたプロパティアクセサメソッドによって行われます。それを除く。

+1

+1を割り当てています。しかし、何度もこのことを言っておかなければなりませんか? – Abizern

+0

彼は保持を取り除くと動作しないと言います。したがって、おそらくプロパティとして保持されていません... @Jesse:currentDivisionプロパティの定義方法に関する詳細情報を提供してください(またはローカル変数です...) –

+0

さらに詳しい情報が追加されました。 – Jesse

関連する問題