通过Objective-C方法保留数组数据

时间:2012-12-13 17:07:08

标签: objective-c arrays retain

我希望我不会重复现有的问题,但我在使用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

提前致谢

2 个答案:

答案 0 :(得分:2)

由于GLfloat是与Objective-C无关的C typedef,因此无法使用任何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];
}

答案 1 :(得分: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]) 
 }