Подтвердить что ты не робот

Предоставляет ли IOS SDK очереди и стеки?

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

4b9b3361

Ответ 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

Ответ 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 и просто показывайте, что хотите. Но вы поймете, что это не нужно.