Estoy escribiendo una aplicación para iPhone, y estoy sorprendido de que no parece haber clases NSQueue o NSStack en el Foundation Framework de Apple. Veo que sería bastante fácil hacer lo propio, comenzando con NSMutableArray, así que lo haré a menos que me haya perdido algo. ¿Me he perdido algo?¿El iOS SDK proporciona colas y pilas?
Respuesta
por lo que sé que no hay una clase genérica avaialbe. Intente utilizar NSMutableArray, agregue mediante addObject y obtenga first/last a través de objectAtIndex y removeObjectAtIndex.
Sí, un NSMutableArray se dobla como una pila o cola. (Sería poco ineficaz como una cola.)
También es posible usar stack
y queue
adaptador de C++ 's, pero hace que la gestión de memoria un poco desordenado si desea almacenar objetos Objective-C con él.
No. No se ha perdido nada. Eso es todo. Objective-C es un lenguaje de nivel más alto similar a C. No se requiere control de bajo nivel.
Las clases de cacao están diseñadas para un uso más fácil que la eficiencia. Si desea lidiar con el rendimiento, tiene una opción de implementación C (o C++) sin formato. De lo contrario, solo usa la manera fácil. Por supuesto, la optimización temprana es malvada.
Si desea un tipo de encapsulamiento, simplemente cree una nueva clase que contenga NSMutableArray. Oculte NSMutableArray interno y exponga lo que desea. Pero te darás cuenta de que esto es innecesario.
Aquí está mi clase de pila, en caso de que sea útil para los que me siguen. Como puede ver, el método pop involucra suficiente código que le gustaría restarle importancia.
Stack.h:
#import <Foundation/Foundation.h>
@interface Stack : NSObject {
NSMutableArray *contents;
}
- (void)push:(id)object;
- (id)pop;
@end
Stack.m
#import "Stack.h"
@implementation Stack
// superclass overrides
- (id)init {
if (self = [super init]) {
contents = [[NSMutableArray alloc] init];
}
return self;
}
- (void)dealloc {
[contents release];
[super dealloc];
}
// Stack methods
- (void)push:(id)object {
[contents addObject:object];
}
- (id)pop {
id returnObject = [[contents lastObject] retain];
if (returnObject) {
[contents removeLastObject];
}
return [returnObject autorelease];
}
@end
Para el método pop, puede guardar un poco escribiendo usando [contents lastObject]. Eso devolverá nil si la matriz está vacía. Terminé implementando los métodos como una categoría en NSMutableArray. Gracias por el código! –
Suena bien, gracias por la sugerencia. –
Personalmente, probablemente solo agregue el método 'pop' a' NSMutableArray' a través de una categoría y use 'NSMutableArray' directamente donde necesite una pila, en lugar de crear una clase' Stack' completamente nueva. La mayoría de los lenguajes que he usado antes no tienen clases de pila dedicadas y usan matrices como pilas. Supongo que puedo ver la elegancia desde una perspectiva de legibilidad de tener una clase que * solo * se puede usar como una pila. –
he puesto un IOS Objetivo C objeto de cola de trabajo en GitHub. El código fue tomado de varias publicaciones y de ninguna manera es propiedad de mí.
https://github.com/esromneb/ios-queue-object/
Si ve algún problema por favor tenedor, y hacer una solicitud de extracción!
Llego un poco tarde a esta fiesta, pero ¿conocen las CHDataStructures?
¡Esto es brillante! ¡Gracias por compartir! – paiego
Otra manera fácil sería para ampliar las capacidades NSMutableArray
's, haciendo uso de categorías objetivo de C. Puede hacerlo mediante la adición de dos archivos a su proyecto:
NSMutableArray + Stack.h
@interface NSMutableArray (StackExtension)
- (void)push:(id)object;
- (id)pop;
@end
NSMutableArray + Stack.m
#import "NSMutableArray+Stack.h"
@implementation NSMutableArray (StackExtension)
- (void)push:(id)object {
[self addObject:object];
}
- (id)pop {
id lastObject = [self lastObject];
[self removeLastObject];
return lastObject;
}
@end
ya se puede utilizar un habitual NSMutableArray
en cualquier otro archivo de su proyecto como una pila y llame al push
o pop
en ese objeto.No se olvide de #import NSMutableArray+Stack.h
en esos archivos. Aquí hay un código de ejemplo de cómo se puede utilizar el nuevo NSMutableArray
como una pila:
NSMutableArray *myStack = [[NSMutableArray alloc] init]; // stack size = 0
NSString *aString = @"hello world";
[myStack push:myString]; // stack size = 1
NSString *anotherString = @"hello universe";
[myStack push:anotherString]; // stack size = 2
NSString *topMostStackObject;
topMostStackObject = [myStack pop]; // stack size = 1
NSLog("%@",topMostStackObject);
topMostStackObject = [myStack pop]; // stack size = 0
NSLog("%@",topMostStackObject);
será la salida del registro:
hello universe
hello world
ObjectiveSugar es una CocoaPod muy popular que ofrece, entre un montón de otras gran cosa, push
y pop
API llama al NSMutableArray
. Claro, no está en el SDK de iOS, pero lo estoy compartiendo aquí porque estaba buscando lo mismo, y esta fue la solución con la que trabajé (y desde luego no me dolió que ya estuviéramos usando este CocoaPod en nuestro base de código).
- 1. Base SDK y iOS Dev Target?
- 2. Destino de implementación de SDK y iOS.
- 3. iOS SDK UIViewContentModeScaleAspectFit vs UIViewContentModeScaleAspectFill
- 4. Colas de espera y colas en C#
- 5. Buscar ABAddressbook iOS SDK
- 6. iOS 4 Build SDK
- 7. Asignación de pilas y montones
- 8. ¿Cuál es el dSYM y cómo usarlo? (iOS SDK)
- 9. ¿Cómo cargo automáticamente el teclado (iOS SDK)?
- 10. xcodebuild, falta el simulador de iOS sdk
- 11. ¿Tiene Ruby contenedores como pilas, colas, listas de enlaces, mapas o conjuntos?
- 12. Utilizando el SDK de iOS Analizar con RubyMotion
- 13. C# Enhebrado y colas
- 14. iOS SDK Desactivar micrófono interno
- 15. Obtener iPhone color iOS Sdk
- 16. ¿Necesita liberar colas GCD bajo ARC en iOS 6.0?
- 17. Temas virtuales/colas y durabilidad
- 18. Perl colas y con hilo
- 19. iOS SDK 4.0 y 4.1 añadir imágenes a simulador
- 20. Objetivo C ARC y variables de instancia iOS SDK
- 21. SDK para leer archivos PPT, xls y .doc en iOS
- 22. C++ - hilos y múltiples colas
- 23. ForEach paralelo, y las colas
- 24. xCode 3 y SDK iOS 5 (¿es posible?)
- 25. Pilas NFC en el sistema operativo Android
- 26. Bases y colas basadas en matriz frente a listas
- 27. Pilas blandas puramente funcionales
- 28. Despliegue de UIScrollView EXC_BAD_ACCESS en iOS SDK
- 29. Eliminación de SDK de iOS de OSX
- 30. Prueba de Google Analytics iOS SDK
Gracias. Me preocupa la duplicación de código, en lugar de la encapsulación. –
¡NO usar una cola es malo! ¿Tienes alguna idea del impacto que tiene? Los arreglos NSMutable NO están diseñados para facilitar el uso (¡por cierto, no son fáciles de usar!), En realidad son eficientes y, como se mencionó anteriormente, se pueden usar para implementar colas. –
@PizzaiolaGorgonzola Lo siento, pero es muy difícil entender lo que realmente quiere decir en este comentario. Y nunca dije que las clases de Cocoa son * ineficaces *. Lo que dije fue que las clases de Cocoa son relativamente menos eficientes y más fáciles de usar que sus contrapartes de nivel C (o C++). – Eonil