2012-06-15 15 views

Respuesta

7

No es posible crear una matriz como lo hace en tiempo de compilación. Eso es porque no es una "constante de tiempo de compilación". En su lugar, se puede hacer algo como:

static NSArray *tArray = nil; 

-(void)viewDidLoad { 
    [super viewDidLoad]; 

    tArray = [NSArray arrayWithObjects:@"A", @"B", @"C", nil]; 
} 

Si es realmente importante que tiene este precompilado, entonces yo supongo que se podría crear un proyecto de prueba, crear la matriz (o cualquier objeto) que necesita, llenarlo, a continuación, serializarlo usando NSKeyedArchiver (que lo guardará en un archivo), y luego incluir ese archivo en su aplicación. Luego deberá usar NSKeyedUnarchiver para desarchivar el objeto para su uso. No estoy seguro de cuál es la diferencia de rendimiento entre estos dos enfoques. Una ventaja de este método es que no tiene un gran bloque de código si necesita inicializar una matriz que incluye muchos objetos.

+0

No es importante tenerlo precompilado, por lo que su solución funciona perfectamente para mí. ¡Gracias! – MoreFamed

+0

Esto crea la matriz cada vez que se ejecuta 'viewDidLoad', una prueba' nil' sería buena. – Cristik

-1

uso de este

NSArray *array = [NSArray arrayWithObjects:str1,str2, nil]; 
+1

Merece la pena señalar que 'str1, str2 ...' pueden ser literales NSString como '@" alguna cadena "', de la misma manera que lo serían para un inicializador de matriz C. I * think * tales cadenas serán ingresadas en tiempo de compilación en la imagen. Sin embargo, no creo que pueda iniciar la matriz en otro lugar que no sea en tiempo de ejecución, al menos no sin algún feo hack de serialización. – walkytalky

+0

Esto no funciona para mí. Lo hice NSArray * a = [NSArray arrayWithObjects: @ "foo", @ "bar", @ "baz", nil]; y el compilador dice "El elemento inicializador no es una constante en tiempo de compilación". Necesito compartir la matriz entre varias rutinas en un módulo, por lo que quiero que la matriz se declare y complete fuera de cualquier rutina ... – MoreFamed

+0

-1 Como señaló MoreFamed, esto no funcionará del modo que él necesita. Su código * funcionaría * si solo necesitara acceder a 'matriz' en un único método, pero necesita acceder a él en toda su clase. – FreeAsInBeer

-2

Por lo que yo entiendo que necesitan una matriz dimensional Puede utilizar métodos de clase de NSArray .. Por ejemplo

NSString *yourString; 
NSArray *yourArray = [[NSArray alloc] initWithObjects:yourString, nil]; 

Si necesita más, por favor Proporcione más detalles sobre su problema

+0

-1 Tu respuesta tiene el mismo problema que @ sheraza's. No va a proporcionar acceso a la matriz en toda la clase. – FreeAsInBeer

-2

Simple como eso: NSArray<NSString*> *stringsArray = @[@"Str1", @"Str2", @"Str3", ...]; Modern ObjectiveC permite genéricos y matrices literales.

Si desea un código más corto, entonces NSArray *stringsArray = @[@"Str1", @"Str2", @"Str3", ...];, ya que los genéricos son opcionales y solo ayudan al acceder a los elementos de la matriz, por lo tanto, más tarde puede volver a lanzar el código a la matriz con plantilla.

+1

No puedo compilarlo como constante/estático. – Andy

+0

Sí, no funcionará, ya que es una construcción ejecutada en tiempo de ejecución. – Cristik

Cuestiones relacionadas