web-dev-qa-db-fra.com

Le SDK iOS fournit-il des files d'attente et des piles?

J'écris une application iPhone et je suis surpris qu'il ne semble pas y avoir de classes NSQueue ou NSStack dans le Foundation Framework d'Apple. Je vois qu'il serait assez facile de lancer le mien, en commençant par NSMutableArray , alors je le ferai à moins que quelque chose ne me manque. Ai-je raté quelque chose?

33
Tommy Herbert

pour autant que je sache, il n'y a pas de classe générique disponible. Essayez d’utiliser NSMutableArray, ajoutez-le via addObject et obtenez le premier/dernier via objectAtIndex et removeObjectAtIndex.

21
Michael W.

Voici ma classe Stack, au cas où elle serait utile à ceux qui viendraient après moi. Comme vous pouvez le constater, la méthode pop implique suffisamment de code pour que vous souhaitiez la factoriser.

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
28
Tommy Herbert

Je suis un peu en retard pour cette soirée, mais connaissez-vous CHDataStructures?

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

6
occulus

Un autre moyen simple consisterait à étendre les capacités de NSMutableArray en utilisant les catégories de Objective C. Vous pouvez le faire en ajoutant deux fichiers à votre projet:

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

Maintenant, vous pouvez utiliser une NSMutableArray régulière dans tous les autres fichiers de votre projet comme une pile et appeler Push ou pop sur cet objet. N'oubliez pas de #import NSMutableArray+Stack.h dans ces fichiers. Voici un exemple de code d'utilisation de votre nouvelle NSMutableArray en pile:

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 sortie du journal sera:

hello universe
hello world
6
Mischa

J'ai placé un objet de file d'attente Objective C iOS fonctionnel sur GitHub. Le code a été emprunté à divers postes et n’est en aucun cas la propriété de moi.

https://github.com/esromneb/ios-queue-object/

Si vous rencontrez des problèmes, n'hésitez pas à nous contacter et à faire une demande de tirage!

5
portforwardpodcast

ObjectiveSugar est un très populaire CocoaPod qui fournit, entre autres choses intéressantes, Push et pop appels d’API sur NSMutableArray. Bien sûr, ce n’est pas dans le SDK iOS, mais je le partage ici parce que je cherchais la même chose, et c’est la solution à laquelle j’ai eu recours (et cela n’a certainement pas nui au fait que nous utilisions déjà ce CocoaPod dans notre base de code).

1
Gabe

Oui, un NSMutableArray sert également de pile ou de file d'attente. (Ce serait légèrement inefficace comme une file d'attente.)

Vous pouvez également utiliser les adaptateurs stack et queue de C++, mais cela rend la gestion de la mémoire un peu compliquée si vous souhaitez stocker des objets Objective-C avec.

1
kennytm

Tu n'as rien manqué. C'est tout. Objective-C est un langage de niveau supérieur ressemblant à C. Le contrôle de bas niveau n'est pas requis.

Les classes de cacao sont conçues pour une utilisation plus facile que l'efficacité. Si vous souhaitez gérer les performances, vous avez l'option d'implémentation brute C (ou C++). Sinon, utilisez simplement le moyen le plus simple. Bien sûr, l’optimisation précoce est néfaste.

Si vous voulez une sorte d’encapsulation, créez simplement une nouvelle classe contenant NSMutableArray. Cachez NSMutableArray interne et exposez ce que vous voulez. Mais vous vous rendrez compte que c'est inutile.

0
Eonil