私のコードはリークして動作するか、リークしてクラッシュしません。これは自動解放の問題ではないようです
-
07-07-2019 - |
質問
ゲームの難しい部分のコーディングを完了した後、メモリ管理のバグを見つけました。
objectsは、カスタムクラスを保持するNSMutableArrayです。
- (void) spawnObjects
{
for (int index = 0; index < INITIAL_OBJECTS; index++)
{
[objects addObject:[[[MatchObject alloc] initWithImageNameID:(index % 3)] autorelease]];
[[objects objectAtIndex:index] setPosition:[GameLayer randomPoint]];
}
...
}
後でこの関数を使用します。
- (void) checkAllSprites
{
NSMutableArray *spritesToDelete = [NSMutableArray array];
for (int index = 0; index < [points count] - 1; index ++)
{
for (MatchObject *planetLike in objects)
{
CGPoint point1 = [[points objectAtIndex:index] CGPointValue];
CGPoint point2 = [[points objectAtIndex:index+1] CGPointValue];
if ([GameLayer lineIntersectsCircle:point1 :point2 :[planetLike position] :16.0f])
{
ParticleSystem *planetDeath = [ParticlePlanetDeath node];
planetDeath.texture = [[TextureMgr sharedTextureMgr] addImage:@"fire.pvr"];
planetDeath.position = [planetLike position];
[self addChild:planetDeath z:0 tag:2];
[spritesToDelete addObject:planetLike];
[self removeChild:planetLike cleanup:YES];
}
}
}
[objects removeObjectsInArray:spritesToDelete];
[spritesToDelete removeAllObjects];
}
最初の機能で自動リリースしない場合、アプリは正常に動作します。その場合、割り当て解除されたオブジェクト([MatchObject position])にアクセスしようとします。
何が問題ですか?!
解決
解放されたメモリを参照しているようです。実際にメモリを解放すると、プログラムがメモリを解放したためにクラッシュします。 autoreleaseを使用してリリースしない場合、オブジェクトが実際に解放されないためにメモリリークが発生してもシステムがそれに気付かないため、それが機能します。 p>
だから、虫眼鏡を出してコードをもう一度見て、デバッガーを使い始めてください...楽しんでください:)
他のヒント
ちょっとした推測:
addChild はオブジェクトを保持しており、 removeChild はオブジェクトを解放していると思います。
しかし、 removeChild がオブジェクトを見つけられなかった場合(つまり、子ではない場合)はどうなりますか?その場合もオブジェクトを解放しますか? (これはすべきではありません)
&quot; removeChild&quot;で何かをしている可能性オブジェクトを解放することになるメソッド?投稿したコードに問題はないようです...
最初の関数は、initに似ていない関数であり、initを呼び出しているため、最初の関数で自動解放する必要があります。
最初の関数の最後では、オブジェクトが保持されている配列に追加したため、オブジェクトは引き続き有効です。
最初に呼び出される関数と2番目に呼び出される関数の間で、誰かがオブジェクトを解放しているため、オブジェクトへのアクセスがクラッシュします。
最初の関数、オブジェクトのdealloc、2番目の関数にブレークポイントを設定して、2回目の呼び出しの前に誰がそれを解放しているかを確認します。