私はこれについて詳細な答えを出そうとします。
まず、@property/@synthesizeディレクティブを使用するときは、変数の周りにゲッター メソッドとセッター メソッドを作成します。
あなたの場合、変数が呼び出されarraySpeechSentences(コンパイラが変数を作成します)、これらのメソッド(セッターとゲッター)にself..
self.arraySpeechSentences = // something
と同じです
[self setArraySpeechSentences:something]; // setter
と
NSMutableArray* something = self.arraySpeechSentences;
に等しい
NSMutableArray* something = [self arraySpeechSentences]; // getter
コードの最初のスニペットで
NSMutableArray *speechSentences = [[NSMutableArray alloc] initWithArray:[tempDict objectForKey:key]];
arraySpeechSentences = speechSentences;
arraySpeechSentences同じオブジェクトspeechSentencesを指します。しかし、[speechSentences release]そのオブジェクトのロックを解除するとarraySpeechSentences、ダングリング ポインターになります。私が推測する割り当て解除されたインスタンスに送信されたメッセージを受け取ります。ゾンビに見えるようにしてみてください。
保持カウントに関して言えば、配列の保持カウントは 1 ですalloc-init。しかし、releaseそれを行うと、保持カウントがゼロになり、オブジェクトが存在しなくなり、アクセスしようとするとクラッシュしますarraySpeechSentences。
代わりに、プロパティを扱うときは、変数に適用されるポリシーが重要です。プロパティはretainポリシーを使用するため、オブジェクトを設定すると
self.arraySpeechSentences = // something
参照されたオブジェクトの保持カウントが増加します。ボンネットの下では、言うことself.arraySpeechSentences = // somethingはセッターを呼び出すことと同じです
- (void)setArraySpeechSentences:(NSMutableArray*)newValue
{
// pseudo code here...
if(newValue != arraySpeechSentences) {
[arraySpeechSentences release];
arraySpeechSentences = [newValue retain];
}
}
2 番目のスニペットは、オブジェクトの保持カウントが実行時に 1 でありalloc-init、呼び出すself.arraySpeechSentences =と 2 になり、解放すると 1 に戻るため、機能します。今回は、オブジェクトの保持カウントが 1 であるため、オブジェクトは存続します。
retainまたはポリシーを持つプロパティがある場合は、同様にcopyオブジェクトを解放することを忘れないでくださいdealloc。そうしないと、リークが発生する可能性があります。
- (void)dealloc
{
[arraySpeechSentences release];
[super dealloc];
}
メモリの仕組みを理解するには、MemoryManagement Apple docを読むことをお勧めします。
PS iOS 5 以降、ARC (自動参照カウント) と呼ばれる新しいコンパイラ機能があり、呼び出しを忘れることができますretain/release。また、オブジェクトグラフの観点から考える必要があるため、検討することをお勧めします。
それが役立つことを願っています。