在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是的,这些示例是为了解释,而不是我在第一段中描述的修复。我已经对此进行了澄清。