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]) 

残念ながら、何らかの理由でデータ配列の情報が失われています

最初の印刷では、意図したとおりに値がすべて表示されます。ただし、2 番目のデータはほとんど保持されません。

これが起こらないようにする方法はありますか?データ型をGLfloatにする必要があるため、NSMutable配列を使用することは問題外であることを指摘したいと思います

前もって感謝します

4

2 に答える 2

2

aGLfloatは 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];
}
于 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 に答える