如何为NSMutableData分配不同的数据类型

时间:2012-06-14 09:52:11

标签: nsmutabledata

我正在尝试创建一个顶点属性数组,用于在网格中存储矢量和索引。我意识到顶点属性可以由vector2,vector3和/或vector4组成,所以我想创建一个适合它们的类,而不需要约束方法来返回某种类型的对象。作为测试,我编写了以下课程,使用NSMutableData

//VertexAttributeArray.h

@interface VertexAttributeArray : NSObject
{
    NSMutableData *vertexData;
}

- (void *)data;
- (CGRect *)rect;

//VertexAttributeArray.m

- (id)init
{
    self = [super init];

    if(self)
    {
        vertexData = [[NSMutableData alloc] initWithLength:0];
    }

    return self;
}

- (void *)data
{
    return [vertexData mutableBytes];
}

- (CGRect *)rect
{
    return [vertexData mutableBytes];
}

- (void)dealloc
{
    if(vertexData)
    {
        [vertexData release];
        vertexData = nil;
    }

    [super dealloc];
}

从我的网格类中,我希望能够调用类似的东西:

VertexAttributeArray *vertexAttributeArray = [[VertexAttributeArray alloc] init];

[vertexAttributeArray data][0] = CGRectMake(0.0, 0.0, 0.0, 0.0); //doesn't work - compiler error
[vertexAttributeArray rect][0] = CGRectMake(0.0, 0.0, 0.0, 0.0); //works fine

访问data的第一个方法将是首选方法,因为这不会限制类使用特定类型的结构,但Xcode只会抛出警告“不完整类型'void'不可分配。”

我不想为不同类型的数据结构提供多种方法,但我目前无法找到解决此问题的方法。拥有返回指向不同类型的指针的方法看起来并不是很优雅,并且添加了大量未使用的(和不需要的)代码。

有没有办法解决这个问题,以创建一个不可知的数据存储?我更喜欢我的网格类有不同的VertexAttributeArray对象来存储顶点,索引,法线和颜色等,所以存储vector2,vector3和vector4是理想的我想成为的地方。我将如何解决这个问题呢?

1 个答案:

答案 0 :(得分:0)

没有办法做你想做的事。在编译时不知道data内的对象的大小。 ((void *)foo)[x]在C中也是非法的。编译器必须知道数组中存储了什么结构,以便能够为其编制索引。

您可以将通话更改为:

((CGRect *)[vertexAttributeArray data])[0] = CGRectMake(0.0, 0.0, 0.0, 0.0);

如果您愿意,从那时起就知道sizeof(CGRect)内的对象之间有data距离。