2012-01-10 14 views
0

を混同iOSのメモリ管理は、私はユーティリティクラスの静的メソッドを持つ

Division *div = [[Division alloc] init]; 
div = [Utilities getDefaultDivision]; 

をしかし、私は分析するとき、それは「潜在的なリークを語ります行xに割り当てられてdefaultDivisionに格納されているオブジェクトの "

私が使用している場合:

Division *defaultDivision = [[[Division alloc] init] autorelease]; 

一度動作しますが、私は再びそれを使用するとき、それがクラッシュします。

ここで適切なことは何ですか?

+0

CrashlogとStacktraceを使用すると、簡単に役立ちます。 – Till

答えて

3

これは実際のコードの場合です。

Division *div = [[Division alloc] init]; 
div = [Utilities getDefaultDivision]; 

あなたは最初の部門を割り当て、divの中にそれを保存し、その後、あなたは最初のものを解放することなく、そのdivの中にあまりにも保存getDefaultDivisionから新しいものを取得しているしています。

+0

さて、私は今やっています。Division * div = [Utilities getDefaultDivision];しかし、私がメソッドオブジェクトにautoreleaseをマークすると、関係なく、私はまだbad_accessを取得します。 – Jesse

+0

割り振り後に部門で何をやっていますか?後で使うためにどこかに保管していますか?保存されていない場所に保管してオートレリースが行われると、あなたは良い場所にいません。 –

+0

あなたは私のためにこれを解決しました。私はそれをappdelegateに保管しています。私は割り当て時にそれを忘れてしまった。今すぐご利用ください!ありがとうございます – Jesse

1

にかかわらず、「getDefaultDivision」が実装されているか、あなたはこのコードでリークを持っているの:

Division *div = [[Division alloc] init]; 
div = [Utilities getDefaultDivision]; 

1行目はメモリを割り当て、そのメモリを指すようにdivを割り当てます。あなたはいくつかの時点でこのメモリを解放する必要があります。しかし、2行目以降は、divに新しい値が追加され、1行目に割り当てられたメモリへのポインタがであり、が失われているため、これは不可能になります。これはリークです。理由を理解するまで、あなたは薄い氷の上にいます。

この方法としては:これは時々「工場」法と呼ばれる

+ (Division *) getDefaultDivision 
{ 
    Division *defaultDivision = [[Division alloc] init]; 
    defaultDivision.Id = 0; 
    defaultDivision.name = @"Accounting"; 
    defaultDivision.slug = @"accounting"; 
    return defaultDivision; 
} 

- 、割り当て、初期化、およびクラスの新しいインスタンスへの参照を返すための静的ユーティリティメソッド。ここでのベストプラクティスは、ファクトリメソッドでオートリリースを使用することです。例:

Division *defaultDivision = [[[Division alloc] init] autorelease]; 

なぜベストプラクティスですか? 「getDefaultDivisionが」ではないのでhttp://developer.apple.com/library/IOs/#documentation/General/Conceptual/DevPedia-CocoaCore/MemoryManagement.html

から -

alloc, allocWithZone:, copy, copyWithZone:, mutableCopy, mutableCopyWithZone: 

:アップルのメモリ管理ガイドによると、その中に次の用語を持つ唯一の方法は、発信者が解除するための責任があるオブジェクトへの参照を返す必要があります"alloc"または "copy"メソッド(それはアクセッサメソッド)では、後で呼び出し側がリークを避けるために解放しなければならないオブジェクトへのポインタを返すべきではありません。新しく割り当てられた返されたメモリをautoreleaseとしてマークすることは、この契約に従う一つの方法です。

+0

'create'キーボードで関数/メソッドも保持されているオブジェクトを返すと期待されていることを忘れないでください。 – v1Axvw

+0

メモリ関連の命名規則の命名規則は、私がARCについてとても満足している理由です。 –

+0

ありがとう、私は今理解しています。しかし、私がファクトリメソッドをautoreleaseとしてマークした場合は、ブームになります。 – Jesse

関連する問題