7

私のゲームiOSプロジェクトでは、リングバッファが必要です。要素が出入りするキューと同様に機能する必要がありますが、バッファ内の要素の合計量は同じままである必要があります。

Javaを使用してリングバッファを正常に実装しましたが、Objective-cにはあまり詳しくありません。CHCircularBufferというWeb上でリングバッファの実装を見つけました:https ://bitbucket.org/devartum/chdatastructures/src/4d6d7194ee94/source/CHCircularBuffer.mしかし、正しく実装できませんでした。

循環バッファは、すべての数学的な地形生成を行うTerrainManagerと呼ばれるクラスのプロパティです。

@interface TerrainManager : NSObject{

    int terrainParts;

    CHCircularBuffer* circularTerrainBuffer;
}

@property(nonatomic, retain) CHCircularBuffer *circularTerrainBuffer;
@end

これは、TerrainManagerの実装でリングバッファが初期化される方法です。

circularTerrainBuffer = [[CHCircularBuffer alloc] initWithCapacity:parts];

これにより、バッファのインスタンスが作成され、sizeプロパティがpartsに設定されます。次に、addObjectメソッドを使用してオブジェクトをバッファに追加します。

[circularTerrainBuffer addObject:[NSNumber numberWithDouble:0.2]];

この行に「exec_bad_access」というエラーが表示されることがあります。たとえば、容量が15のバッファを初期化すると、すべてが正常になり、20の場合はエラーが発生します。

ここで、描画が行われる地形クラスからバッファにアクセスしようとします。しかし、オブジェクトにアクセスしようとすると、「bad_access」エラーが発生します。

NSArray *arr = [terrainManager.circularTerrainBuffer allObjects];

たとえば、この行はエラーを作成します。

だから私のコードに何か問題があります。たぶん私はバッファを理解しておらず、間違った方法でオブジェクトを追加しています。知らない。何かアイデアや提案はありますか?

4

1 に答える 1

3

あなたが示しているコードのスニペットは正しいです。あなたが指定した方法をテストするために小さなプロジェクトを実装しましたが、CHCircularBuffer正しく動作します。したがって、問題は別の場所にあるはずです。

これを回避する唯一の方法は、IMHO、失敗した行にブレークポイントを置き、addObject関数にステップインして、失敗した場所を正確に確認することです。配列はそこで再割り当てされる可能性があるため、これが失敗してアクセスが悪い可能性があります。についても同じですallObjects

とにかく、問題なくテストを実行し、オブジェクトを追加し、頭と尾からそれらを削除し、すべてのオブジェクトの配列を問題なく取得できたと言わざるを得ません。

より多くのコードを投稿していただければ、もう少しお役に立てるかもしれません。

于 2011-06-30T10:30:18.560 に答える