各オブジェクトに 2 回メモリを割り当てています。2 回目に割り当てて同じ変数に割り当てると、割り当てられたメモリの最初の部分にアクセスできなくなり、解放できなくなります。
次に、testedit の mutableCopy を作成し、コピーを元の変数に割り当てます。繰り返しますが、アクセスできないメモリの一部が浮かんでいます。
非 ARC メモリ管理のルールは、 alloc、new、copy、またはkeepごとに、対応するreleaseが必要です。6 つの割り当て、1 つのコピー、および 3 つのリリースしかありません。
ここにいくつかの提案があります。
これらの重複した割り当てを削除します。
testedit = [[NSString alloc] init];
withString1a = [[NSString alloc] init];
forString1a = [[NSString alloc] init];
おそらくtestedit
、withString1a
およびforString1a
はすべて iVar です。( iVar を自動合成されたプロパティとして宣言し、それらを self.testedit ... として参照してください。これにより、オーバーフローをスタックするコードが非常に明確になります)。
これをすべて取り出します:
if (testedit) {
[testedit release];
[withString1a release];
[forString1a release];
}
これらがすべて iVar であると仮定すると、それらを解放する正しい場所はオブジェクトのdealloc
メソッドにあります。
実際withString1a
にforString1a
は、コンテンツを他の場所から取得するため、ローカル変数にすることができます。
NSString* withString1a = [[[NSString alloc] initWithFormat:@"e"] autorelease];
NSString* forString1a = [[[NSString alloc] initWithFormat:@"flk34j"] autorelease];
autorelease
メソッドが終了した後にぶらぶらする必要がないので、それらを使用できます。
これらの行は次のようにも記述できます。
NSString* withString1a = [NSString stringWithFormat:@"e"];
NSString* forString1a = [NSString stringWithFormat:@"flk34j"];
(-stringWithFormat は、自動解放されたオブジェクトを返す便利なメソッドです)
残りはこの 2 行です。
testedit = [[NSString alloc] initWithFormat:@"example"];
testedit = [[testedit stringByReplacingOccurrencesOfString:withString1a
withString:forString1a] mutableCopy];
testit を最初の行で不変の文字列として、2 番目の行で変更可能な文字列として扱う理由は明らかではありません。testedit
新しい文字列に置き換えているため、ここでは変更可能な文字列はまったく必要ありません。
self.testedit = [[NSString alloc] initWithFormat:@"example"];
self.testedit = [[testedit stringByReplacingOccurrencesOfString:withString1a
withString:forString1a] copy];
copy
(自動解放されたオブジェクトを返す必要がありstringByReplacingOccurrencesOfString:withString:
、ここではそれを保持したい)
ジグソーパズルの最後のピースは、_testedit iVar メモリ割り当てを取り除くことです。オブジェクトのメソッドでこれを行いdealloc
ます。
- (void) dealloc {
[_testEdit release];
[super dealloc];
}
( init
、アクセサ、およびメソッドは、プロパティ構文を使用して iVar を参照してはならないdealloc
3 つの場所であることに注意してください。)
大丈夫ですが、実際には ARC を使用する必要があります。この方法では、メモリの管理をコンパイラに依存する場合よりも、メモリのバグが発生する可能性がはるかに高くなります。