1

私は目的の c を学ぼうとしていますが、メモリ管理についてまだ少し混乱しています。はい、わかっています。ARC を使用する必要がありますが、私のプロジェクトではサポートされていない TouchXML が使用されています。また、私が読んだメモリ管理に関する多くのドキュメントとスレッドがありますが、皆さんが私を明確にするのを手伝ってくれることを願っています。

オブジェクトを割り当てた人は、それを解放する責任があることを学びました。また、「保持」すると参照カウンターが増加し、「解放」すると減少することも学びました。オブジェクトの参照カウンターが 0 になると、自動的に割り当てが解除されます。「autorelease」が現在のイベントサイクルの最後にオブジェクトを自動的に解放することをついに学びました。それはいいです。

ここで、次のケースを検討してください。

オブジェクトのライフサイクル全体で使用する必要がある配列を割り当てます。オブジェクトが削除されたときにそれを解放する責任があります。

@implementation MyClass
-(id) init {
  myArray = [[NSMutableArray alloc] init]; // this is a @property
}

- (void) dealloc {
  [myArray release];
  [super dealloc];
}
@end

このように、dealloc メソッドでは、myArray を解放すると、myArray の割り当ても解除されます。次に、myClass から新しいオブジェクトをインスタンス化し、myArray をこのように保持すると...

// MyOtherClass

MyClass *o = [[[MyClass alloc] init] autorelease];
NSMutableArray *retainedArray = [[o.myArray] retain];

...現在のイベント サイクルの最後に、"o" は自動的に割り当て解除されますが、retainedArray (実際には o.myArray を指している) は [retainedArray release] を呼び出すまで割り当て解除されません。ここまでで正しいでしょうか?

もしそうなら、私は次のようなものを呼び出す場合にも同じことが当てはまると思います:

NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"somePath" error:nil];

コードのどこかに保持しない限り、「コンテンツ」に対して release または autorelease を呼び出す必要はありません (そうしないと実行時エラーが発生します)。正しい?

もしそうなら、すべてを要約すると、最終的には、alloc または preserve のいずれかを呼び出す場合にのみ release を呼び出す必要があります。私のクラスの参照カウントのバランスは常に 0 である必要があります。ここで、alloc/retains は +1 を与え、release は -1 を与えます。正しい?

4

3 に答える 3

5

あなたの言ったことはほぼ 100% 正しいですが、リリースしなければならない (+1) 保持オブジェクトを取得するケースがいくつかあります。

基本的な規則は次のとおりです ( 「基本的なメモリ管理規則」を参照)。

  • 最終的にはrelease、または自分が所有autoreleaseするオブジェクトが必要です。
  • 名前が「alloc」、「new」、「copy」、または「mutableCopy」で始まるメソッドを使用して作成したオブジェクトを所有している</li>
  • を使用して所有権を取得すると、オブジェクトを所有しretainます。

"Static Analyzer" (Product -> Xcode メニューの Analyze) は、この規則に対する違反を見つけるのに非常に優れているため、それを使用することをお勧めします。

于 2013-06-05T08:16:07.737 に答える