【问题标题】:Retaining array data through methods objective-C通过方法objective-C保留数组数据
【发布时间】:2012-12-13 17:07:07
【问题描述】:

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

提前致谢

【问题讨论】:

  • 您是否可能正在存储浮点指针并且实际上想要存储浮点数?

标签: objective-c arrays retain


【解决方案1】:

由于 GLfloat 是与 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];
}

【讨论】:

    【解决方案2】:

    问题是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]) 
     }
    

    【讨论】:

      猜你喜欢
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      相关资源
      最近更新 更多