Quiero ver EXACTAMENTE cómo crea una matriz. ¿Cómo puedo ver los archivos .m que muestran cómo se hace?¿qué hace -arrayWithArray en realidad?
Respuesta
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 :-).
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.
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.
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
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
- 1. ¿Qué hace ImageSwitcher en realidad?
- 2. ¿Qué hace CascadeType.REFRESH en realidad?
- 3. ¿Qué hace #include en realidad? En
- 4. ¿Qué hace requestValidationMode = "2.0" en realidad?
- 5. Math.floor (Math.random()) ¿Qué hace +1 en realidad?
- 6. ¿Qué hace ifstream :: rdbuf() en realidad?
- 7. ¿Qué hace JVM marcar CMSClassUnloadingEnabled en realidad?
- 8. ¿Qué hace XCode 'Clean' en realidad?
- 9. ¿Qué hace Sinatra :: Base.condition en realidad?
- 10. Qué hace Kernel.Inject (instancia); en realidad?
- 11. ¿Qué hace $ this-> escape() en zend framework en realidad?
- 12. ¿Qué hace la configuración INSTALLED_APPS en Django en realidad?
- 13. ¿Qué hace un sombreador de píxeles en realidad?
- 14. ¿Qué hace Array.Clear en realidad bajo las sábanas?
- 15. ¿Qué hace Objective-C en realidad cuando declaras un objeto?
- 16. ¿Qué significa "dinámico" en realidad?
- 17. ¿Qué establece set_locale (LC_CTYPE, 'C'); en realidad?
- 18. ¿Qué función funciona en realidad python print()?
- 19. ¿Qué hace Travis-CI en realidad en el desarrollo de PHP?
- 20. ¿Qué hace eval en base64 la variable $ _POST ['e'] en realidad?
- 21. ¿Qué significa software "performant" en realidad?
- 22. ¿Qué significa "outer =>" en realidad?
- 23. ¿Qué significa $ this en realidad?> Codeigniter
- 24. ¿Qué significa en realidad LRU de Memcached?
- 25. ¿Qué significa en realidad "Registrarse para la interoperabilidad COM"?
- 26. ¿Qué hace _locking() realmente?
- 27. En Delphi, ¿qué hacen realmente System.TMonitor.Pulse y TMonitor.PulseAll en realidad
- 28. ¿Para qué sirve StringIO en python en realidad?
- 29. ¿Qué hace '@_' en Perl?
- 30. ¿Qué hace == en Ruby?
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
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
¿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 . –