Как реализовать CHCircularBuffer в проекте iOS? - PullRequest
7 голосов
/ 21 июня 2011

для моего игрового проекта iOS мне нужен кольцевой буфер. Он должен работать аналогично очереди, в которой элементы выходят и входят, но общее количество элементов в буфере должно оставаться неизменным.

Я успешно реализовал кольцевой буфер, используя java, но я не настолько знаком с целью-c. Я нашел в сети реализацию кольцевого буфера под названием CHCircularBuffer: 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];

Это создает экземпляр буфера и устанавливает свойство размера в части. Теперь я добавляю объекты в буфер, используя метод addObject:

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

Иногда эта строка получает ошибку "exec_bad_access". Например. когда я инициализирую буфер емкостью 15, все в порядке, с 20 я получаю ошибку.

Теперь я пытаюсь получить доступ к буферу из класса terrain, где происходит рисование. Но всякий раз, когда я пытаюсь получить доступ к объектам, я получаю ошибку «bad_access».

NSArray *arr = [terrainManager.circularTerrainBuffer allObjects];

например. эта строка создаст ошибку.

Так что с моим кодом что-то не так. Может быть, я не понимаю буфер и неправильно добавляю объекты. Я не знаю. Есть идеи или предложения?

1 Ответ

3 голосов
/ 30 июня 2011

Фрагменты кода, который вы показываете, верны.Я реализовал небольшой проект для проверки CHCircularBuffer так, как вы указали, и он работает правильно.Таким образом, проблема должна быть где-то еще.

Единственный способ обойти это, ИМХО, поставить точку останова на линии, которая терпит неудачу, и войти в функцию addObject, чтобы увидеть, где именно она не работает.Массив может быть перераспределен там, поэтому может произойти сбой, что приведет к неправильному доступу.То же самое для allObjects.

В любом случае, я должен сказать, что я мог бы выполнить свой тест без каких-либо проблем, добавив объекты, удалив их из головы и хвоста, и получив массив всех объектов без проблем.

Если вы разместите больше кода, мы можем помочь немного больше.

...