コンテキスト: Cocos2D の破壊可能な地形ライブラリの機能の 1 つは、折りたたみ可能な地形です。効率的に折りたたむために、ピクセルが変更された列を、整数を含む NSNumbers を含む NSMutableSet に格納します。重複する列を反復処理したくないため、このデータ構造を使用しています。
NSMutableSet をループする方法についての私の最初の本能は、'for in' ループを使用することでした。
for (NSNumber * col in [alteredColumns allObjects]) { // Works
// for (NSNumber * col in alteredColumns) { // Crashes
int x = col.intValue;
bool shouldShift = false;
bool alphaFound = false;
for (int y = (size_.height -1); y >= 0; y--) {
if (!shouldShift) {
if ([self pixelAt:ccp(x,y)].a == 0) {
// Need to shift all pixels above one down
alphaFound = true;
} else if (alphaFound) {
didCollapse = shouldShift = true;
// Ensure the top pixel is alpha'ed out if a collapse will occur
[self setPixelAt:ccp(x,0) rgba:ccc4(0, 0, 0, 0)];
[self setPixelAt:ccp(x,(y+1)) rgba:[self pixelAt:ccp(x,y)]];
} // end inner if
} else {
// Need to shift pixels down one
[self setPixelAt:ccp(x,(y+1)) rgba:[self pixelAt:ccp(x,y)]];
} // end if
} // end inner for
// Remove column from cache if no pixels collapsed
if (!shouldShift) [alteredColumns removeObject:col];
} // end outer for
しかし、これは悪い結果につながりました。プログラムは、Bad Access Memory エラーでクラッシュします。[alteredColumns allObjects] を使用するように for ループを変更すると、すべて正常に動作します。質問です... NSMutableSet などの順序付けられていないコレクションで「for in」ループを使用できませんか? allObjects などのメソッドを使用する必要がある場合、これは効率的ですか?
前もって感謝します!