我希望我不会重复现有的问题,但我在使用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
提前致谢
答案 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])
}