にかかわらず、「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としてマークすることは、この契約に従う一つの方法です。
CrashlogとStacktraceを使用すると、簡単に役立ちます。 – Till