EVDataQueue 0.0.2

EVDataQueue 0.0.2

Ever 维护。



  • Ever

EVDataQueue

使用单链表实现的一个队列;在内存占用、入队耗时、出队耗时、线程安全等方面,有较好的性能;

与其他方案进行比较:

  • 1,使用数组 NSMutableArray,如果出队后,不移除对象,即实现为循环队列的方式,则入队出队性能较好,但内存占用较高(因为所有的对象都在数组中保存,出队后,并没有实际移除);
  • 2,使用数组 NSMutableArray,如果出队后,移除对象,则内存占用较少,但入队出队性能特别差(因为数组特性:移除某个元素后,其后面的所有元素都需要前移);
  • 3,使用弱引用数组 NSPointerArray,当对象移除后,内存自动释放;但是 NSPointerArray 的添加元素、移除元素方法,性能较差;且因为是弱引用对象,还需要借助其他方式,来持有对象(如果队列不持有对象,则入队后,对象就立即释放掉了);
  • 4,使用二级指针的形式,来保存所有对象的指针,该方案入队出队性能较好,但需要单独编码,来实现队列内存的扩容、缩容;出队后,及时手动释放内存;否则同样存在内存占用过高的问题;与单链表实现相比,二级指针的方式入队出队性能稍微优越一点,但考虑到内存占用问题,还需要更多的编码来实现内存管理,且因为内存管理带来的性能损耗,故单链表的实现方式更优;
     //    void **arr = calloc(100, sizeof(void *));
     //    id obj = @"";
     //    void *p = (__bridge void *)(obj);
     //    arr[0] = p;

使用 CocoaPods 安装

pod 'EVDataQueue', '~> 0.0.1'

API

@interface EVDataQueue<ElementType> : NSObject

- (instancetype)init NS_UNAVAILABLE;

/**
 默认初始化方法

 @param maxCapacity 队列最大容量(超出最大容量后,入队 会返回失败)
 @return 实例
 */
- (instancetype)initWithMaxCapacity:(int)maxCapacity NS_DESIGNATED_INITIALIZER;

/**
 入队

 @param obj 入队对象
 @return 入队是否成功(目前:只有队列打到最大容量时,会导致入队失败)
 */
- (BOOL)enqueue:(ElementType)obj;

/**
 出队

 @return 出队对象
 */
- (ElementType)dequeue;

/**
 队列是否为空

 @return 是否为空
 */
- (BOOL)isEmpty;

/**
 队列是否已达到最大容量

 @return 是否已满
 */
- (BOOL)isFull;

/**
 当前队列中的对象个数

 @return 对象个数
 */
- (int)size;

/**
 释放整个队列
 */
- (void)freeAll;

@end

微信公众号:汪汪的世界

(WeChat)