在我使用NSMutableArray
之前,我想知道是否有更标准的方式来实现队列。我在苹果文档中没有看到任何信息,但如果没有人们正在使用的队列实现,我会感到惊讶的。Java让我太宠了!
在我使用NSMutableArray
之前,我想知道是否有更标准的方式来实现队列。我在苹果文档中没有看到任何信息,但如果没有人们正在使用的队列实现,我会感到惊讶的。Java让我太宠了!
使用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
Cocoa本身没有队列类,也没有标准的队列类,但有几个选项,其中一个最适合您的需求。请参见这个问题(以及我的回答)。
如你所说,您可以使用NSMutableArray自己编写队列。如果您只需要一个快速且不那么拘谨的队列(并且不用担心复制、编码/解码、枚举等等),那么@Matt建议的解决方案是一个简单的方法。您还应考虑通过分类向NSMutableArray
添加队列方法,这样你的“队列”也是一个数组(因此你可以将其作为NSArray参数传递),而且你可以免费获得所有NS(Mutable)Array功能。
如果性能很重要,我建议使用更适合删除第一个元素的结构。出于这个原因,我为自己的框架编写了CHCircularBufferQueue。(不是要吹嘘自己,只是想帮助其他人节省时间。)
我根据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
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