iOS SDK是否提供队列和堆栈?

我正在编写一个iPhone应用程序,而且我很惊讶苹果基金会框架中似乎没有NSQueue或NSStack类。 我发现从一个NSMutableArray开始我们自己开发是非常容易的,所以我会这么做,除非我错过了一些东西。 我错过了什么吗?

据我所知,没有generics类的avaialbe。 尝试使用NSMutableArray,通过addObject添加并通过objectAtIndex和removeObjectAtIndex获取第一个/最后一个。

这是我的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 

我对这个派对有点迟,但是你知道CHDataStructures吗?

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

另一个简单的方法是通过使用Objective C的类别来扩展NSMutableArray的function。 您可以通过将两个文件添加到您的项目中来实现:

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在这些文件中#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 

我已经把一个工作的iOS Objective C队列对象放在GitHub上。 代码是从各个职位采取的,决不是我所有的。

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

如果你看到任何问题请叉,并提出拉请求!

是的,一个NSMutableArray作为堆栈或队列加倍。 (作为一个队列,效率会比较低。)

你也可以使用C ++的stackqueue适配器,但是如果你想存储Objective-C对象的话,它会让内存pipe理变得有点麻烦。

ObjectiveSugar是一个非常受欢迎的CocoaPod,它提供了一大堆其他优秀的东西,在NSMutableArraypushpop API调用。 当然,这不是在iOS SDK中,但是我在这里分享它,因为我正在寻找同样的东西,这是我去的解决scheme(它肯定没有伤害,我们已经在我们的CocoaPod代码库)。

不,你没有遗漏 就这样。 Objective-C是更高级的语言,看起来像C.低级别的控制是不需要的。

cocoa类被devise为比效率更容易使用。 如果你想处理性能,你可以select原始的C(或C ++)实现。 否则,只需使用简单的方法。 当然,早期优化是邪恶的。

如果你想要一种封装,只要创build一个包含NSMutableArray的新类。 隐藏内部NSMutableArray,只是揭露你想要的。 但是你会意识到这是不必要的。