2010-09-06 2 views
33

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

ответ

21

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

1

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

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

0

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

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

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

+1

Спасибо. Меня беспокоит дублирование кода, а не инкапсуляция. –

+0

НЕ использовать очередь зла!, У вас есть представление о влиянии, которое имеет? NSMutable массивы НЕ предназначены для простоты использования (они, кстати, не так просто использовать AT ALL!), Они действительно эффективны и, как уже упоминалось выше, могут использоваться для реализации очередей. –

+1

@PizzaiolaGorgonzola Прошу прощения, но очень сложно понять, что вы на самом деле имеете в виду в этом комментарии. И я никогда не говорил, что уроки какао неэффективны *. Я сказал, что классы Cocoa относительно менее эффективны и более удобны в использовании по сравнению со своими коллегами уровня C (или C++). – Eonil

28

Вот мой класс 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 
+2

Для метода pop вы можете сохранить немного ввода, используя [contents lastObject]. Это вернет nil, если массив пуст. Я закончил внедрение методов в качестве категории в NSMutableArray. Спасибо за код! –

+0

Звучит неплохо - спасибо за подсказку. –

+1

Лично я бы просто добавил метод 'pop' к' NSMutableArray' через категорию и использовал 'NSMutableArray' там, где мне нужен был стек, вместо того, чтобы создавать совершенно новый класс' Stack'. Большинство языков, которые я использовал до этого, не имеют выделенных классов стека и используют массивы в виде стеков. Я полагаю, что я вижу элегантность с точки зрения читаемости того, что класс, который может * использоваться * только как стек. –

5

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

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

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

6

Другой простой способ будет расширить возможности NSMutableArray «s путем использования категорий 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 
1

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

Смежные вопросы