私は目的の 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 を与えます。正しい?