2012-03-28 7 views
2

Ich versuche, eine Objective C-Klasse zu schreiben, die ein OpenGL-Polygon zeichnet. Ich habe es geschafft, dies mit einem NSMutableArray zu tun, um meine Eckpunkt-Koordinaten zu speichern. Dies scheint jedoch ein wenig ineffizient zu sein, da jedes Mal, wenn ein Objekt gezeichnet wird, eine Schleife über das Array erforderlich ist, um das NSMutableArray in ein ccVertex2F [] -Array zu konvertieren.Objective C primitive c-Array-Instanzvariable bei Klasseninitialisierung zuweisen

Was ich tun möchte, ist ein ccVertex2F Array als Instanzvariable. Setzen Sie dann bei der Initialisierung die Größe auf die Anzahl der Punkte. Dies führt jedoch zu einem Fehler, da die Größe meines Arrays immer Null ist.

Ich bin erfahren in der Programmierung von Java, aber völlig neu in C und Speicherverwaltung. Bisher ist dies, was ich habe:

@interface PolygonNode : CCNode { 
    ccVertex2F * _glPoints ; 
} 

@property (nonatomic, readwrite) ccVertex2F * glPoints ; 
@end 

Mein Verständnis ist, dass ich eine Instanzvariable bin zu schaffen, die ein Zeiger auf eine ccVertex2F ist.

In meiner Init-Methode habe ich folgende:

ccVertex2F sizedGlPoints [numberOfPoints * sizeof(ccVertex2F)]; 
    _glPoints = &sizedGlPoints; 

Das Ziel war die Instanz-Variable Punkt auf meine neue richtigen Größe Array zu machen. Wenn ich jedoch die Größen nach diesem Code drucke, ändert sich die _glPoints-Größe nicht.

Der Kern von dem, was ich tun möchte, ist in der Lage zu sein, die Größe meines Arrays zu wählen, wenn ich die Klasse initialisiere, so dass ich keinen Speicher verschwenden werde.

Antwort

2

können Sie malloc verwenden, um Speicher für das Array zuzuordnen:

ccVertext2F *newMemory = malloc(numberOfPoints * sizeof(ccVertex2F)); 
if (newMemory == NULL) { 
    // Handle error 
} 
_glPoints = newMemory; 

Denken Sie daran, es zu befreien, wenn Sie (in -dealloc oder bevor Sie weisen es wieder) fertig sind:

free(_glPoints); 
+0

Dank für die Antwort. Das hat perfekt funktioniert! –

0

Wenn Sie versuchen, mit reinem C zu reservieren, verwenden Sie malloc oder calloc, um zuzuweisen und die Zuordnung zu delegieren.

So würde

ccVertex2F sizedGlPoints [numberOfPoints * sizeof(ccVertex2F)]; 
_glPoints = &sizedGlPoints; 

_glPoints = (ccVertex2F *) calloc(numberOfPoints, sizeof(ccVertex2F); 

werden, wenn ccVertex2F eine Objective-Klasse waren, Sie

[ ccVertex2F alloc ] 

zu tun, um die Zuordnung verwenden würde.

Verwandte Themen