¿El SDK de iOS proporciona queues y stacks?

Estoy escribiendo una aplicación para iPhone, y me sorprende que no haya classs de NSQueue o NSStack en Apple Foundation Framework . Veo que sería bastante fácil crear el mío propio, comenzando con un NSMutableArray , así que haré eso a less que me haya perdido algo. ¿Me he perdido algo?

por lo que sé, no hay una class genérica disponible. Intente utilizar NSMutableArray, agregue a través de addObject y obtenga primero / último a través de objectAtIndex y removeObjectAtIndex.

Aquí está mi class Stack, en caso de que sea útil para aquellos que vienen después de mí. Como puede ver, el método pop implica un código suficiente que querrá tener en count.

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 

Llegué un poco tarde a esta fiesta, pero ¿estás al tanto de CHDataStructures?

http://cocoaheads.byu.edu/code/CHDataStructures

Otra forma fácil sería extender las capacidades de NSMutableArray haciendo uso de las categorías de Objective C. Puedes hacerlo agregando dos files a tu 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 

Ahora puede usar un NSMutableArray regular en cada otro file de su proyecto, como una stack y una llamada, push o push pop ese object. No olvide #import NSMutableArray+Stack.h en esos files. Aquí hay un código de ejemplo de cómo puede usar su nuevo NSMutableArray como una stack:

 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); 

La salida del logging será:

 hello universe hello world 

He puesto un object de queue iOS Objective C 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 bifurcar y hacer una request de extracción.

Sí, un NSMutableArray se dobla como una stack o queue. (Sería un poco ineficiente como una queue).

También puede usar la stack C ++ y el adaptador de queue , pero hace que la administración de la memory sea un poco desorderada si desea almacenar objects Objective-C con él.

ObjectiveSugar es un CocoaPod muy popular que proporciona, entre otras muchas cosas geniales, llamadas de API push y pop en 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 fui (y ciertamente no dolió que ya estuviéramos usando este CocoaPod en nuestro base de código).

No. No te perdiste nada. Eso es todo. Objective-C es un lenguaje de nivel superior, como C. No se requiere control de bajo nivel.

Las classs de cocoa están diseñadas para un uso más fácil que la eficiencia. Si desea tratar con el performance, tiene una opción de implementación C (o C ++) sin formatting. De lo contrario, solo usa una manera fácil. Por supuesto, la optimization temprana es malvada.

Si desea una class de encapsulación, simplemente haga una nueva class que contenga NSMutableArray dentro de ella. Ocultar interior NSMutableArray y solo exponer lo que quieras. Pero te darás count de que esto es innecesario.