7

对于我的游戏 iOS 项目,我需要一个环形缓冲区。它的工作方式应该类似于元素出入的队列,但缓冲区中的元素总数应该保持不变。

我使用java成功实现了环形缓冲区,但我对objective-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];

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

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

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

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

NSArray *arr = [terrainManager.circularTerrainBuffer allObjects];

例如,这一行会产生错误。

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

4

1 回答 1

3

您显示的代码片段是正确的。我实施了一个小项目来测试CHCircularBuffer您指定的方式并且它可以正常工作。所以,问题一定出在其他地方。

解决这个问题的唯一方法是,恕我直言,在失败的行上放置一个断点并进入addObject函数以查看失败的确切位置。数组可以在那里重新分配,所以这可能是失败并提供了错误的访问权限。对于allObjects.

无论如何,我不得不说我可以毫无问题地执行我的测试,添加对象,从头部和尾部删除它们,并毫无问题地获取所有对象的数组。

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

于 2011-06-30T10:30:18.560 回答