2009-09-08 10 views

Respuesta

16

Como mencionó @Ken, no se puede ver la fuente (aunque se puede desmontar el método a través de gdb).

El método en sí crea un inmutable (no se puede cambiar), autoreleased copia de la matriz dada. Los siguientes son idénticos en comportamiento:

// Both resulting arrays are immutable and won't be retained 
NSArray* immutableArray = [[[NSArray alloc] initWithArray:mutableArray] autorelease]; 
NSArray* immutableArray = [NSArray arrayWithArray:mutableArray]; 
NSArray* immutableArray = [[mutableArray copy] autorelease]; 

Elija la que más le guste por brevedad, supongo :-).

+0

Hmmm ... ¿Es inmutable? Bueno, tengo que enviar a cada objeto de la nueva matriz un mensaje de lanzamiento adicional (alloc init usado) para que no haya pérdidas. ¿Cómo libero todos los objetos en una matriz inmutable? – RexOnRoids

+0

los objetos son retenidos por la matriz cuando se agregan, por lo que cuando la matriz se libera, los objetos internos también se deben liberar – slf

+0

¿Por qué necesita una nueva matriz para enviar un mensaje de liberación a los objetos? Inmutable significa que el ARRAY no se puede cambiar, siempre se puede cambiar (o enviar mensajes) a objetos dentro de la matriz ... O mejor aún, libera los objetos antes de agregarlos a la matriz y no tienes que preocuparte por nada . –

2

No, Cocoa no es de código abierto.

Si tiene alguna pregunta, simplemente debe formularla.

Esta sería una forma válida para ponerlo en práctica:

+ (id)arrayWithArray:(NSArray *)array { 
    return [[[self alloc] initWithArray:array] autorelease]; 
} 

se puede leer la fuente GNUStep para NSArray, pero tenga en cuenta que esta es una implementación alternativa de las API Cocoa.

2

Si está preguntando cuál es el propósito de +arrayWithArray (además de ser una envoltura de liberación automática alrededor del -initWithArray), diría que es esto: Úselo cuando desee crear una copia de una matriz que se haya publicado automáticamente. En otras palabras, se podía ver así:

NSArray * original = /* ... */; 
NSArray * newArray = [NSArray arrayWithArray:original]; 

es equivalente a:

NSArray * original = /* ... */; 
NSArray * newArray = [[original copy] autorelease]; 

yo diría que está ahí para la conveniencia de usar cuando se ajusta a su estilo.

+1

No es del todo cierto. Su suposición es que 'original' es un NSArray. Pero puede ser cualquier cosa derivada de NSArray. Y la clase del objeto puede implementar su propia 'copia'. Por lo tanto '' [[copia original] liberación automática]; 'no garantiza devolver un NSArray. – Coyote

0

GNUstep, la implementación GNU de la especificación de la que OPENSTEP Cacao y Cocoa Touch descender, implementa +arrayWithArray: de la siguiente manera:

/** 
* Returns a new autoreleased NSArray instance containing all the objects from 
* array, in the same order as the original. 
*/ 
+ (id) arrayWithArray: (NSArray*)array 
{ 
    id o; 

    o = [self allocWithZone: NSDefaultMallocZone()]; 
    o = [o initWithArray: array]; 
    return AUTORELEASE(o); 
} 

http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/NSArray.m?view=markup

Cuestiones relacionadas