2009-09-14 27 views
5

tengo una prueba pequeña herramienta fundación (Objective-C) que estoy jugando con y tengo algunas preguntas ...¿Agregar objetos de cadena a 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; 
} 

En primer lugar, por lo general me suelte un objeto después de añadirlo a una matriz, pero ¿Estoy en lo cierto al pensar que lo que tengo actualmente es correcto porque "tempString" es un literal de cadena, y como tal no necesita ser asignado o liberado?

En segundo lugar, cuando ejecuto esto (antes de la ejecución) obtengo el siguiente error "no se puede leer el comando de carga desconocido 0x80000022" si esto es un problema con mi código? de buscar en google parece que podría ser un error en xCode 3.1.2, ¿alguien tiene alguna idea?

Finalmente algo que estoy haciendo mal, la idea es llenar una matriz con 10 cuerdas "Planet_001" a través de "Planet_010"

EDIT: Ah, ya veo, eso es debido a la "= [NSString" bits es decir

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

muchas gracias, muy apreciados -gary-

Respuesta

5

tempString no es en realidad una cadena literal. @"Planet_%03d"es una cadena literal. tempString es un objeto de autorretrato, lo que significa que se liberará cuando se agote el NSAutoreleasepool. Básicamente, la memoria ya está administrada y no tienes que hacer nada.

La regla es: Si new, alloc, copy o retain un objeto, entonces usted tiene que release ella. De lo contrario, la memoria ya está administrada, probablemente mediante una liberación automática.

Además, se olvidó de liberar pool. Aparte de eso, se ve bien.

+1

Él libera el grupo: [desagüe de la piscina] –

+0

Gracias chicos, veo lo que está sucediendo ahora, pequeña edición anterior para explicar ... – fuzzygoat

+0

@Chris tienes razón. No sabía que 'drain' hace un 'lanzamiento'. –

1

Una posible razón para el error "incapaz de leer la carga desconocida comando 0x80000022" parece ser que he actualizado a Snow Leopard sin actualizar los desarrolladores herramientas al mismo tiempo. Parece que el error puede deberse al intentar usar la versión 10.5 de XCode para compilar en un entorno 10.6. Lo investigaré mañana.

Xcode 3.2 ya está disponible en la versión Snow Leopard (Mac OS X 10.6). Después de instalar Snow Leopard, actualice a Xcode 3.2 instalándolo por separado de la imagen de disco de Xcode Tools. Puede instalarlo sobre versiones anteriores de Xcode, o moverlas a un lado antes de la instalación.

PS: Cuando me dieron el "incapaz de leer la carga desconocida comando 0x80000022" error estaba corriendo OSX 10.6.1 con xCode 3.1.2

aplausos -gary-

+0

Si las herramientas no están en sincronía con la versión del sistema operativo que esté utilizando, arreglar eso primero. Es una configuración inestable conocida. – NSResponder

Cuestiones relacionadas