2009-09-14 35 views
5

Ich habe ein kleines Fundament Werkzeugtest (Objective-C), die mit denen ich spielen, und ich habe ein paar Fragen ...Hinzufügen von String-Objekten zu NSMutableArray?

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    int planetLoop; 
    NSString *tempString; 
    NSMutableArray *planetArray = [[NSMutableArray alloc] init]; 

    NSLog(@"STRING ARRAY ... Start"); 
    for(planetLoop=0; planetLoop<10; planetLoop++) { 
     tempString = [NSString stringWithFormat: @"Planet_%03d", planetLoop+1]; 
     NSLog(@"Planet_%03d", planetLoop+1); 
     [planetArray addObject:tempString]; 
    } 

    [planetArray release]; 
    [pool drain]; 
    return 0; 
} 

Zuerst in der Regel löse ich ein Objekt, nachdem es zu einem Array hinzufügen, aber Habe ich recht, wenn ich denke, dass das, was ich gerade habe, richtig ist, weil "tempString" ein String-Literal ist und als solches nicht zugewiesen oder freigegeben werden muss?

Zweitens, wenn ich dies (vor der Ausführung) ich bekomme die folgenden eror "nicht in der Lage, unbekannter Ladebefehl 0x80000022 zu lesen", wenn dies ein Problem mit meinem Code? von der Suche auf Google sieht es aus wie es könnte ein Fehler in xCode 3.1.2 sein, hat jemand irgendwelche Ideen?

schließlich alles, was ich tue, falsch ist, ist die Idee, ein Array mit 10 string "Planet_001" bis hin zu "Planet_010"

EDIT zu füllen: Ah, ich sehe, das ist wegen der "= [NSString" Bit

dh
// Autoreleased object 
tempString = [NSString stringWithFormat: @"Planet_%03d", planetLoop+1]; 
// String literal 
tempString = @"Planet_"; 

vielen dank, sehr geschätzt -gary-

Antwort

5

tempString ist nicht wirklich ein Zeichenfolgenliteral @"Planet_%03d"ist ein String-Literal. tempString ist ein automatisch freigegebenes Objekt, was bedeutet, dass es freigegeben wird, wenn das NSAutoreleasePool leer ist. Grundsätzlich ist der Speicher bereits verwaltet und Sie müssen nichts tun.

Die Regel lautet: Wenn Sie new, alloc, copy oder retain ein Objekt, dann Sie release es haben. Sonst wird der Speicher bereits verwaltet, wahrscheinlich durch eine Autorelease.

Sie haben auch vergessen, pool freizugeben. Ansonsten sieht es gut aus.

+1

Er gibt den Pool frei: [Pool Drain] –

+0

Danke Jungs, ich sehe, was gerade passiert, kleine Bearbeitung oben zu erklären ... – fuzzygoat

+0

@Chris du hast Recht. Mir war nicht bewusst, dass 'drain' eine' release' macht. –

1

Ein möglicher Grund für die „nicht in der Lage unbekannt Ladebefehl 0x80000022 zu lesen“ Fehler scheint zu sein, dass ich auf Snow Leopard aktualisiert haben, ohne dass die Entwickler ein Upgrade Werkzeuge gleichzeitig. Es sieht so aus, als ob der Fehler dadurch verursacht wird, dass versucht wird, die 10.5-Version für XCode in einer 10.6-Umgebung zu kompilieren. Ich werde das morgen untersuchen.

Xcode 3.2 ist jetzt in der Snow Leopard (Mac OS X 10.6) Version verfügbar. Nach der Installation von Snow Leopard müssen Sie auf Xcode 3.2 aktualisieren, indem Sie es separat vom Xcode Tools Disk Image installieren. Sie können es über frühere Versionen von Xcode installieren oder vor der Installation verschieben.

PS: Wenn ich den "nicht in der Lage unbekannt Ladebefehl 0x80000022 lesen" erhielt Fehler war ich mit OSX 10.6.1 mit xCode 3.1.2

prost -gary-

+0

Wenn Sie Ihre Werkzeuge nicht synchron mit der OS-Version sind Sie verwenden, beheben, dass zuerst. Es ist eine bekannte instabile Konfiguration. – NSResponder

Verwandte Themen