在objective-C objecti接口中声明结构数组

在objective-C objecti接口中声明结构数组,objective-c,Objective C,我想声明一个简单的结构数组这是我的代码。。。但它不起作用: @implementation GLPlane{ GLKVector2 *vertices; } -(id)init{ if(self = [super init]){ vertices = {<---- This operation seems to be not allowed. GLKVector2Make(0.0f, 0.5f), GLK

我想声明一个简单的结构数组这是我的代码。。。但它不起作用:

@implementation GLPlane{
    GLKVector2 *vertices;
}

-(id)init{

    if(self = [super init]){
        vertices = {<---- This operation seems to be not allowed. 
            GLKVector2Make(0.0f, 0.5f),
            GLKVector2Make(-0.5f, 0.5f),
            GLKVector2Make(0.0f, 0.0f)
        };
    }
    return self;

}

您应该使用NSValue类:

您可以将结构包装到NSValue类对象,然后将其添加到数组中

转换:

NSValue *anObj = [NSValue value:&vector withObjCType:@encode(GLKVector2)];
NSArray *array = [NSArray arrayWithObjects:anObj, nil];
撤销:

NSValue *anObj = [array objectAtIndex:0];
GLKVector2 vector;
[anObj getValue:&vector];

您应该使用NSValue类:

您可以将结构包装到NSValue类对象,然后将其添加到数组中

转换:

NSValue *anObj = [NSValue value:&vector withObjCType:@encode(GLKVector2)];
NSArray *array = [NSArray arrayWithObjects:anObj, nil];
撤销:

NSValue *anObj = [array objectAtIndex:0];
GLKVector2 vector;
[anObj getValue:&vector];
是指针,而不是数组。您必须先分配内存,然后才能分配 价值观:

ARC不管理这种类型的分配,因此您应该在
dealloc
中释放内存:

- (void)dealloc 
{
    free(vertices);
}
请注意,第二个示例已编译,但不正确:
顶点
将是指向本地堆栈变量的指针,因此在
init
方法返回时无效

是指针,而不是数组。您必须先分配内存,然后才能分配 价值观:

ARC不管理这种类型的分配,因此您应该在
dealloc
中释放内存:

- (void)dealloc 
{
    free(vertices);
}

请注意,您的第二个示例已编译,但不正确:
顶点
将是指向本地堆栈变量的指针,因此在
init
方法返回时无效。

首先,您所做的将导致内存损坏,不要这样做。您正在堆栈上创建一个数组,并将其分配给一个变量,该变量的生存期将超过数据有效的堆栈帧。您需要
malloc
空间(记住在
dealloc
中释放它),并一次初始化一个元素(或者创建一个临时数组并复制它)。或者,更好的是,使用NSArray

现在,为了澄清让您感到困惑的数组行为(请注意,这些行为基于您发布的代码,因此受到上述堆栈分配问题的影响):

但是,作为一个特殊的例外,当您在声明中初始化数组时,编译器会假定它是当前声明的类型,这就是为什么这样做的原因:

    GLKVector2 tempArray[] = {
        GLKVector2Make(0.0f, 0.5f),
        GLKVector2Make(-0.5f, 0.5f),
        GLKVector2Make(0.0f, 0.0f)
    };

    vertices = tempArray;

首先也是最重要的是,你所做的会导致内存损坏,不要这样做。您正在堆栈上创建一个数组,并将其分配给一个变量,该变量的生存期将超过数据有效的堆栈帧。您需要
malloc
空间(记住在
dealloc
中释放它),并一次初始化一个元素(或者创建一个临时数组并复制它)。或者,更好的是,使用NSArray

现在,为了澄清让您感到困惑的数组行为(请注意,这些行为基于您发布的代码,因此受到上述堆栈分配问题的影响):

但是,作为一个特殊的例外,当您在声明中初始化数组时,编译器会假定它是当前声明的类型,这就是为什么这样做的原因:

    GLKVector2 tempArray[] = {
        GLKVector2Make(0.0f, 0.5f),
        GLKVector2Make(-0.5f, 0.5f),
        GLKVector2Make(0.0f, 0.0f)
    };

    vertices = tempArray;

您面临的问题与结构无关,实际上是数组初始化方式的问题。使用此符号创建数组时:

int myArr[] = {1, 3, 4, 5};
它仅在声明数组并同时初始化它时起作用。这是爪哇、C、C++和Objtovi.C中的情况。然而,你还有一个问题,那就是声明一个指针,然后尝试添加项目。但指针不是数组,例如:

int myOtherArr[5];
int *mySecondArr;

myotherar
mysecondar
不同。要将指针用作数组,必须使用malloc或new或类似的方法将内存分配为数组。

您面临的问题与结构无关,实际上是数组初始化方式的问题。使用此符号创建数组时:

int myArr[] = {1, 3, 4, 5};
它仅在声明数组并同时初始化它时起作用。这是爪哇、C、C++和Objtovi.C中的情况。然而,你还有一个问题,那就是声明一个指针,然后尝试添加项目。但指针不是数组,例如:

int myOtherArr[5];
int *mySecondArr;

myotherar
mysecondar
不同。为了将指针用作数组,必须使用malloc或new或类似的方法将内存分配为数组。

分配不是初始化。我添加了一些详细信息。错误是
Expected Expression
抱歉,但是这两个向下投票的方式是什么?请注意,在第二个示例中
vertices
将是指向本地堆栈变量的指针,因此在init方法返回时无效。因此,没有办法将此结构存储在对象接口中吗?赋值不是初始化。我有添加了更多信息。错误是
Expected Expression
抱歉,这两个向下的投票方式?请注意,在第二个示例中
顶点
将是指向本地堆栈变量的指针,因此在init方法返回时无效。因此,没有办法将此结构存储在对象接口中吗?对于基于性能的OpenGL调用,这是这是个糟糕的主意。它比用malloc创建的纯C数组慢得多。对于基于性能的OpenGL调用来说,这是一个糟糕的想法。它比使用malloc创建的纯C数组慢得多。在上两个示例中,请注意,该数组将分配到堆栈上,在堆栈帧“pops”之后,您将释放数组。@RichardJ.RossIII是的,这些示例是为了解释,而不是我在第一段中描述的修复。我已经对此进行了澄清。在最后两个示例中,请注意,数组将分配到堆栈上,在堆栈帧“pops”之后,您将释放数组。@RichardJ.RossIII是的,这些示例是为了解释,而不是我在第一段中描述的修复。我已经对此进行了澄清。