0

我希望我不会重复现有问题,但我在使用 OpenGL ES 在 Objective-C 中保留数据数组时遇到了一些问题。这是交易:

我有这个类具有以下属性:

@property GLfloat* data;

这个类有一个方法,结束于:

-(void)loadObj {
     (...)
     GLfloat glData[n];
     (...) //populate glData array
     self.data = glData;
     NSLog(@"%i", self.data[1]) 
 }

回到我的主目录,我创建了一个该类的实例并继续调用 loadObj 函数。

loader = [[ObjLoader alloc] init];
[loader loadObj];
data = loader.data;
NSLog(@"%i", data[1]) 

不幸的是,它的数据数组由于某种原因丢失了它的信息

在第一次打印时,值都在那里,它们的预期方式。但是,在第二个方面,几乎没有保留任何数据。

有什么办法可以防止这种情况发生吗?我想指出,使用 NSMutable 数组是不可能的,因为我需要数据类型为 GLfloat

提前致谢

4

2 回答 2

2

由于 aGLfloat是与 Objective-C 无关的 C 类型定义,因此您无法通过使用任何 Objective-C 特性来保留它。

您的示例中的问题是这GLfloat glData[n]是一个自动分配到堆栈上的数组。当您声明它的函数返回给调用者时,指向的数据不再有效。

你应该怎么做它自己管理内存:

-(void)loadObj {
     (...)
     GLfloat *glData = calloc(n, sizeof(GLfloat));
     (...) //populate glData array
     self.data = glData;
 }

通过这种方式,您在堆中分配数组,并且在函数退出时它不会变得无效。请注意,此内存不是由 Objective-C 管理的,因此您有责任在需要时释放它,例如

-(void)dealloc {
  free(self.data);
  [super dealloc];
}
于 2012-12-13T17:11:27.077 回答
1

问题是它 GLfloat glData[n];是在堆栈上分配的,即,一旦您离开该方法,它就会被释放。您需要使用堆分配内存:

-(void)loadObj {
     (...)
     GLfloat *glData = (GLfloat*)malloc(n*sizeof(GLfloat)); //don't forget to free it
     (...) //populate glData array
     self.data = glData;
     NSLog(@"%i", self.data[1]) 
 }
于 2012-12-13T17:10:39.313 回答