在使用NSMutableArray
滚动自己的队列之前,我想知道是否有更多标准可用。我没有在Apple文档中看到任何内容,但如果没有人们使用的某个地方没有Queue实现,我会感到惊讶。 Java破坏了我!
答案 0 :(得分:10)
基于NSMutableArray
实现队列非常简单,可能不到50行代码。
编辑:
通过快速谷歌搜索找到了这个:
@interface Queue:NSObject {
NSMutableArray* objects;
}
- (void)addObject:(id)object;
- (id)takeObject;
@end
@implementation Queue
- (id)init {
if ((self = [super init])) {
objects = [[NSMutableArray alloc] init];
}
return self;
}
- (void)dealloc {
[objects release];
[super dealloc];
}
- (void)addObject:(id)object {
[objects addObject:object];
}
- (id)takeObject {
id object = nil;
if ([objects count] > 0) {
object = [[[objects objectAtIndex:0] retain] autorelease];
[objects removeObjectAtIndex:0];
}
return object;
}
@end
答案 1 :(得分:5)
Cocoa本身没有Queue类,并且本身没有标准,但有几个选项,其中一个可能最适合您的需求。请参阅this question(和my answer)。
就像你说的那样,你可以使用NSMutableArray自己动手。如果你只需要一个quick'n'dirty队列(并且不担心复制,编码/解码,枚举等),那么@Matt建议的解决方案是一种简单的方法。您还应该考虑adding queue methods to NSMutableArray
via a category,这很好,因为您的“队列”也是一个数组(因此您可以为NSArray参数传递它),并且您可以免费获得所有NS(Mutable)数组功能。
如果性能很重要,我建议使用更适合删除第一个元素的结构。出于这个原因,我为自己的框架写了CHCircularBufferQueue。 (不是试图嘟嘟我自己的号角,只是试图挽救他人一段时间。)
答案 2 :(得分:1)
我根据Matt Bridges代码创建了一个仅包含deque方法的类别。
@interface NSMutableArray (ShiftExtension)
// returns the first element of self and removes it
-(id)shift;
@end
@implementation NSMutableArray (ShiftExtension)
-(id)shift {
if([self count] < 1) return nil;
id obj = [[[self objectAtIndex:0] retain] autorelease];
[self removeObjectAtIndex:0];
return obj;
}
@end
答案 3 :(得分:0)
您可以使用C ++标准库中的STL队列。
答案 4 :(得分:0)
查看STL priority queue。它需要零行代码,并且它是可移植的!你还想要什么?
答案 5 :(得分:0)
您可以使用NSArray的:lastObject方法。这是一个未经测试的例子:
Queue.h
#import <Foundation/Foundation.h>
@interface Queue : NSObject
-(void)enqueue:(id)object;
-(id)dequeue;
@end
Queue.m
#import "Queue.h"
@interface Queue()
@property(nonatomic, strong) NSMutableArray *backingArray;
@end
@implementation Queue
-(id)init {
self = [super init];
if (self) {
self.backingArray = [NSMutableArray array];
}
return self;
}
-(void)enqueue:(id<NSObject>)object {
[self.backingArray addObject:object];
}
-(id)dequeue {
id object = [self.backingArray lastObject];
[self.backingArray removeObject:object];
return object;
}
@end