Предоставляет ли iOS SDK очереди и стеки? - PullRequest
34 голосов
/ 06 сентября 2010

Я пишу приложение для iPhone, и меня удивляет, что в Apple Foundation Framework нет классов NSQueue или NSStack.Я вижу, что было бы довольно легко свернуть мою собственную, начиная с NSMutableArray , поэтому я сделаю это, если я что-то не пропустил.Я что-то пропустил?

Ответы [ 8 ]

28 голосов
/ 10 сентября 2010

Вот мой класс Stack, на случай, если он пригодится тем, кто придет за мной.Как видите, метод pop включает в себя достаточно кода, который вы бы хотели выделить из него.

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
22 голосов
/ 06 сентября 2010

насколько я знаю, нет универсального класса avaialbe.Попробуйте использовать NSMutableArray, добавьте через addObject и получите first / last через objectAtIndex и removeObjectAtIndex.

6 голосов
/ 18 декабря 2013

Другим простым способом было бы расширить возможности 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
6 голосов
/ 29 июня 2012

Я немного опоздал на эту вечеринку, но знаете ли вы о CHDataStructures?

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

5 голосов
/ 22 декабря 2011

Я поместил работающий объект очереди iOS Objective C на GitHub. Код взят из разных постов и ни в коем случае не принадлежит мне.

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

Если вы видите какие-либо проблемы, пожалуйста, раскошелитесь и сделайте запрос на извлечение!

1 голос
/ 24 августа 2015

ObjectiveSugar - это очень популярный CocoaPod, который предоставляет, среди множества других замечательных вещей, push и pop вызовы API для NSMutableArray.Конечно, это не в iOS SDK, но я делюсь этим здесь, потому что я искал то же самое, и это было решением, с которым я пошел (и, конечно, не повредило, что мы уже использовали этот CocoaPod в нашемкодовая).

1 голос
/ 06 сентября 2010

Да, NSMutableArray удваивается как стек или очередь.(Это было бы немного неэффективно как очередь.)

Вы также можете использовать адаптеры C ++ stack и queue, но это делает управление памятью немного запутанным, если вы хотите хранить с ним объекты Objective-C.

0 голосов
/ 06 сентября 2010

Нет.Вы ничего не пропустили.Это все.Objective-C - это язык более высокого уровня, похожий на C. Контроль низкого уровня не требуется.

Классы какао разработаны для более легкого использования, чем эффективность.Если вы хотите иметь дело с производительностью, у вас есть возможность реализации в сыром C (или C ++).В противном случае просто используйте простой способ.Конечно, ранняя оптимизация - это зло.

Если вы хотите инкапсуляцию, просто создайте новый класс, содержащий NSMutableArray.Скрыть внутренний NSMutableArray и просто выставить то, что вы хотите.Но вы поймете, что в этом нет необходимости.

...