Sto scrivendo un'app per iPhone e sono sorpreso che non ci siano classi NSQueue o NSStack in Apple Foundation Framework. Vedo che sarebbe abbastanza facile eseguire il mio, iniziando con uno NSMutableArray, quindi lo farò a meno che non mi sia sfuggito qualcosa. Ho perso qualcosa?L'SDK di iOS fornisce code e stack?
risposta
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.
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.
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.
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
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! –
Sembra buono, grazie per il suggerimento. –
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ò. –
ho messo un oggetto di coda di Objective C iOS lavorando su GitHub. Il codice è stato preso da vari post e in nessun modo è di mia proprietà.
https://github.com/esromneb/ios-queue-object/
Se si notano problemi si prega di forchetta, e fare una richiesta di pull!
Sono un po 'in ritardo per questa festa, ma siete a conoscenza di CHDataStructures?
Questo è geniale! Grazie per la condivisione! – paiego
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
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).
- 1. Stack e code, perché?
- 2. SSA per stack machine code
- 3. Lettura dello stack stack per iOS Webkit
- 4. Quale versione di sqlite fornisce iOS?
- 5. iOS Twitter NSURLErrorDomain Code = -1012
- 6. Elaborazione code e code di database
- 7. Il controllo versione iOS fornisce un avviso
- 8. Errore di rete casuale e occasionale (NSURLErrorDomain Code = -1001 e NSURLErrorDomain Code = -1005)
- 9. NSAttributoString boundingRectWithSize fornisce diverse altezze tra iOS 6 e iOS 7
- 10. DRYing code in iOS/Objective-C
- 11. containerURLForSecurityApplicationGroupIdentifier: fornisce risultati diversi su simulatore iPhone e Watch
- 12. Blocco iOS senza errore o Stack Trace
- 13. Perl Code e filettatura
- 14. Differenza tra "stack di chiamate" e "stack di thread"
- 15. Come gestire i modelli di Code-Code?
- 16. ! Clrstack -p non fornisce i valori dei parametri per i metodi nello stack di chiamate
- 17. Allocazione PIMPL e stack
- 18. Stack e scope C++
- 19. Code e maniglie di attesa in C#
- 20. Code messaggi Posix e riga di comando?
- 21. asyncio e coroutine vs code di attività
- 22. IIS non fornisce i numeri di riga nello stack trace anche se pdb è presente
- 23. Eventi OpenCL e code comandi
- 24. Beginning Code :: blocks e UnitTest ++
- 25. C++ - thread e code multiple
- 26. SCons code generation e VariantDir
- 27. Argomenti virtuali/code e durata
- 28. driver di periferica e stack di driver
- 29. transazioni e code distribuite, ruby, erlang, scala
- 30. Impossibile ottenere la posizione in iOS (GEOErrorDomain Code = -204)
Grazie. È la duplicazione del codice di cui sono preoccupato, piuttosto che l'incapsulamento. –
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. –
@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