Я пишу приложение для iPhone, и я удивлен, что в Apple Foundation Framework нет классов NSQueue или NSStack. Я вижу, что было бы легко свернуть свое, начиная с NSMutableArray, поэтому я сделаю это, если не пропущу что нибудь. Я что-то пропустил?
Предоставляет ли IOS SDK очереди и стеки?
Ответ 1
Насколько я знаю, нет универсального класса avaialbe. Попробуйте использовать NSMutableArray, добавьте через addObject и получите первый/последний через objectAtIndex и removeObjectAtIndex.
Ответ 2
Здесь мой класс Stack, если он полезен для тех, кто идет за мной. Как вы можете видеть, поп-метод включает в себя достаточно кода, который вы бы хотели его исключить.
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
Ответ 3
Я немного опаздываю на эту вечеринку, но знаете ли вы о CHDataStructures?
Ответ 4
Другим простым способом было бы расширить возможности NSMutableArray
, используя категории Objective C. Это можно сделать, добавив два файла в ваш проект:
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
Теперь вы можете использовать обычный NSMutableArray
в каждом другом файле вашего проекта, например стек, и вызвать push
или pop
на этом объекте. Не забывайте #import NSMutableArray+Stack.h
в этих файлах. Вот пример кода, в котором вы можете использовать новый NSMutableArray
как стек:
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);
Выход журнала будет:
hello universe
hello world
Ответ 5
Я поставил на объект GitHub рабочий объект объекта Object Object Object iOS. Код был взят из разных сообщений и никоим образом не принадлежит мне.
https://github.com/esromneb/ios-queue-object/
Если вы видите какие-либо проблемы, пожалуйста, используйте вилку и сделайте запрос на тягу!
Ответ 6
Да, NSMutableArray удваивается как стек или очередь. (Это будет немного неэффективно в качестве очереди.)
Вы также можете использовать адаптеры С++ stack
и queue
, но это делает управление памятью немного беспорядочным, если вы хотите сохранить с ним объекты Objective-C.
Ответ 7
ObjectiveSugar - очень популярный CocoaPod, который предоставляет среди множества других отличных вещей push
и pop
API вызывает NSMutableArray
. Конечно, это не в SDK iOS, но я делюсь им здесь, потому что я искал одно и то же, и это было решение, с которым я пошел (и это, конечно, не помешало, что мы уже использовали этот CocoaPod в нашей кодовая).
Ответ 8
Нет. Вы ничего не пропустили. Все это. Objective-C Язык более высокого уровня похож на C. Низкий уровень управления не требуется.
КлассыCocoa предназначены для более легкого использования, чем эффективность. Если вы хотите иметь дело с производительностью, у вас есть опция реализации C (или С++). В противном случае просто используйте простой способ. Конечно, ранняя оптимизация - это зло.
Если вы хотите своего рода инкапсуляцию, просто создайте новый класс, содержащий внутри него NSMutableArray. Скрывайте внутренний NSMutableArray и просто показывайте, что хотите. Но вы поймете, что это не нужно.