2010-09-06 6 views

risposta

21

per quanto ne so non esiste un avaialbe di classe generico. Provare a utilizzare NSMutableArray, aggiungere tramite addObject e ottenere prima/ultima tramite objectAtIndex e removeObjectAtIndex.

1

Sì, un NSMutableArray funge da stack o coda. (Sarebbe un po 'inefficiente come una coda.)

Si potrebbe anche usare stack e queue adattatore C++ s', ma rende la gestione della memoria un po 'disordinato, se si desidera memorizzare gli oggetti Objective-C con esso.

0

No. Non hai perso nulla. È tutto. Objective-C è un linguaggio di livello superiore simile a C. Non è richiesto un controllo di basso livello.

Le classi di cacao sono progettate per un utilizzo più semplice dell'efficienza. Se si desidera gestire le prestazioni, si ha un'opzione di implementazione C (o C++) non elaborata. Altrimenti, usa semplicemente un modo semplice. Certo, l'ottimizzazione iniziale è cattiva.

Se si desidera un tipo di incapsulamento, è sufficiente creare una nuova classe che contenga NSMutableArray al suo interno. Nascondi NSMutableArray interno e mostra solo ciò che desideri. Ma ti renderai conto che questo non è necessario.

+1

Grazie. È la duplicazione del codice di cui sono preoccupato, piuttosto che l'incapsulamento. –

+0

NON usare una coda è malvagia!, Hai qualche idea dell'impatto che ha? Gli array NSMutable NON sono solo progettati per essere facili da usare (non sono facili da usare a TUTTI a proposito!), Sono effettivamente efficienti e, come detto sopra, possono essere utilizzati per implementare le code. –

+1

@PizzaiolaGorgonzola Mi dispiace ma è molto difficile capire cosa intendi in questo commento. E non ho mai detto a Cocoa che le lezioni sono * inefficienti *. Quello che ho detto è che le classi Cocoa sono relativamente meno efficienti e più facili da usare rispetto alle loro controparti di livello C (o C++). – Eonil

28

Ecco la mia lezione di gruppo, nel caso sia utile a chi viene dopo di me. Come puoi vedere, il metodo pop coinvolge abbastanza codice che vorresti tener conto.

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 
+2

Per il metodo pop, è possibile salvare un po 'di digitazione utilizzando [contents lastObject]. Questo restituirà zero se l'array è vuoto. Ho finito per implementare i metodi come categoria su NSMutableArray. Grazie per il codice! –

+0

Sembra buono, grazie per il suggerimento. –

+1

Personalmente, probabilmente aggiungerei il metodo 'pop' a' NSMutableArray' tramite una categoria e usare un 'NSMutableArray' direttamente ovunque mi serva uno stack, piuttosto che creare una classe' Stack' completamente nuova. La maggior parte delle lingue che ho usato prima non hanno classi di stack dedicate e usano gli array come stack. Suppongo di poter vedere l'eleganza dal punto di vista della leggibilità di avere una classe che può * solo * essere usata come una pila, però. –

6

Un altro modo semplice sarebbe quella di estendere le capacità di 's NSMutableArray facendo uso di categorie Obiettivo di C. Potete farlo con l'aggiunta di due file al progetto:

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 

Ora è possibile utilizzare un normale NSMutableArray in ogni altro file del progetto come una pila e chiamare push o pop su quell'oggetto.Non dimenticare di #import NSMutableArray+Stack.h in quei file. Ecco alcuni esempi di codice come è possibile utilizzare il nuovo NSMutableArray come 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); 

L'uscita del registro sarà:

hello universe 
hello world 
1

ObjectiveSugar è un CocoaPod molto popolare che offre, tra un mucchio di altri grandi cose, push e pop chiamate API su NSMutableArray. Certo, non è nell'SDK di iOS, ma lo sto condividendo qui perché stavo cercando la stessa cosa, e questa è stata la soluzione con cui sono andato (e certamente non faceva male che stavamo già usando questo CocoaPod nel nostro codebase).

Problemi correlati