如何在iOS项目中实现CHCircularBuffer?

时间:2011-06-21 11:52:11

标签: objective-c circular-buffer chdatastructures

对于我的游戏iOS项目,我需要一个环形缓冲区。它应该类似于一个队列,其中元素熄灭并进入,但缓冲区中元素的总量应该保持不变。

我使用java成功实现了环形缓冲区,但我不熟悉objective-c。我在Web上找到了一个名为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];

这将创建缓冲区的实例,并将size属性设置为parts。现在我使用addObject方法将对象添加到缓冲区:

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

有时此行会收到错误“exec_bad_access”。例如。当我初始化容量为15的缓冲区时,一切都很好,20我得到了错误。

我现在尝试从绘图发生的terrain类访问缓冲区。但每当我尝试访问对象时,我都会收到“bad_access”错误。

NSArray *arr = [terrainManager.circularTerrainBuffer allObjects];

E.g。这一行会产生错误。

所以我的代码出了问题。也许我不理解缓冲区并以错误的方式添加对象。我不知道。有什么想法或建议吗?

1 个答案:

答案 0 :(得分:3)

您展示的代码段正确无误。我实现了一个小项目,以您指定的方式测试CHCircularBuffer,并且它可以正常工作。所以,问题必定在其他地方。

解决这个问题的唯一方法是,恕我直言,在失败的线路上放置一个断点,然后进入addObject功能,看看它到底失败了。阵列可以在那里重新分配,因此可能会失败并给出错误的访问权限。 allObjects也一样。

无论如何,我必须说我可以毫无问题地执行我的测试,添加对象,从头部和尾部移除它们,以及获取所有对象的数组而没有任何问题。

如果您发布更多代码,我们可以提供更多帮助。