2012-12-13 22 views
0

我希望我不重複一個存在的問題,但我遇到了一些問題,用OpenGL ES保留Objective-C中的數據數組。這裏的交易:保留陣列數據通過方法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是一個C的typedef有無關的Objective-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]; 
} 
+0

+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]) 
} 
+0

+1爲自己的內存分配提示 –