对于我的游戏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。这一行会产生错误。
所以我的代码出了问题。也许我不理解缓冲区并以错误的方式添加对象。我不知道。有什么想法或建议吗?
答案 0 :(得分:3)
您展示的代码段正确无误。我实现了一个小项目,以您指定的方式测试CHCircularBuffer
,并且它可以正常工作。所以,问题必定在其他地方。
解决这个问题的唯一方法是,恕我直言,在失败的线路上放置一个断点,然后进入addObject
功能,看看它到底失败了。阵列可以在那里重新分配,因此可能会失败并给出错误的访问权限。 allObjects
也一样。
无论如何,我必须说我可以毫无问题地执行我的测试,添加对象,从头部和尾部移除它们,以及获取所有对象的数组而没有任何问题。
如果您发布更多代码,我们可以提供更多帮助。