只是想知道创建手动数组的最佳方法,不使用NSMutalbleArray,我一直在研究最好的解决方案,但没有优雅的答案,你怎么看,在Objective C中,什么是从中创建NSMutableArray样式对象的最佳方法刮? 使用FIFO队列作为最终解决方案,即使是基本的阵列结构也是一个很好的提示!谢谢, 约翰
答案 0 :(得分:15)
NSMutableArray上的类别是IMO最简单的方法。我有一个堆栈类(LIFO)和队列(FIFO)
标题
#import <Foundation/Foundation.h>
@interface NSMutableArray (QueueStack)
-(id)queuePop;
-(void)queuePush:(id)obj;
-(id)stackPop;
-(void)stackPush:(id)obj;
@end
实施
#import "NSMutableArray+QueueStack.h"
@implementation NSMutableArray (QueueStack)
// Queues are first-in-first-out, so we remove objects from the head
-(id)queuePop {
@synchronized(self)
{
if ([self count] == 0) {
return nil;
}
id queueObject = [[[self objectAtIndex:0] retain] autorelease];
[self removeObjectAtIndex:0];
return queueObject;
}
}
// Add to the tail of the queue
-(void)queuePush:(id)anObject {
@synchronized(self)
{
[self addObject:anObject];
}
}
//Stacks are last-in-first-out.
-(id)stackPop {
@synchronized(self)
{
id lastObject = [[[self lastObject] retain] autorelease];
if (lastObject)
[self removeLastObject];
return lastObject;
}
}
-(void)stackPush:(id)obj {
@synchronized(self)
{
[self addObject: obj];
}
}
@end
制作和使用队列:
NSMutableArray *queue = [NSMutableArray array];
//Put an item in the queue
[queue queuePush:myObj];
//Retrieve an item, (this will be the first one)
MyCoolObject *myObject = [queue queuePop];
答案 1 :(得分:2)
具有FIFO方式的数组:
if (mutArr.count == 5) {
for (int j = 0; j < 4; j++) {
[mutArr exchangeObjectAtIndex:j withObjectAtIndex:j+1];
}
[mutArr removeObjectAtIndex:4];
[mutArr addObject:mutDict];
}else{
[mutArr addObject:mutDict];
}
答案 2 :(得分:1)
即使我不理解NSMutableArray的问题,这里有一种方法可以使用双向链表实现队列(希望我做对了,我有点累了;)):
注意:我假设使用ARC。
//Node.h
@interface Node : NSObject
@property (strong)id value;
@property (strong)Node *previous;
@property (strong)Node *next;
//Node.m
@implementation
@end
/Queue.h
@interface Queue : NSObject
- (void)enqueue:(id)objectToEnqueue;
- (id)dequeue;
@end
//Queue.m
@interface Queue ()
{
Node *start;
}
@implementation
- (void)enqueue:(id)objectToEnqueue
{
Node *node = [Node new];
node.value = objectToEnqueue;
if (nil == start)
{
node.previous = node;
node.next = node;
start = node;
}
else
{
node.previous = start.previous;
node.next = start;
start.previous = node;
start = node;
}
}
- (id)dequeue
{
if (nil == start)
return nil;
Node *node = start.previous;
start.previous = start.previous.previous;
start.previous.next = start;
id objectToDequeue = node.value;
return objectToDequeue;
}
@end
如果你正在寻找一种在纯C中做到这一点的方法,也许这会对你有帮助: