1. 内存占用优化
- 复用迭代器对象:避免每次遍历都创建新的迭代器实例。可以使用对象池来管理迭代器对象,在需要时从对象池中获取,使用完毕后归还到对象池中。
- 减少数据拷贝:迭代器在遍历数据结构时,尽量避免对数据进行不必要的拷贝。如果数据结构中的元素较大,应该传递引用而不是值。
2. 遍历效率优化
- 使用高效的数据结构:根据实际需求选择合适的数据结构。例如,对于频繁插入和删除操作的场景,链表可能更合适;对于随机访问频繁的场景,数组可能更高效。
- 采用分块遍历:对于非常大的数据结构,可以将其分成多个小块,每次只遍历一个小块,这样可以减少一次性加载的数据量,提高遍历效率。
代码示例
// 定义一个协议表示可遍历的对象
@protocol Traversable <NSObject>
- (id<Iterator>)createIterator;
@end
// 定义一个协议表示迭代器
@protocol Iterator <NSObject>
- (BOOL)hasNext;
- (id)next;
@end
// 具体的数据结构类,实现Traversable协议
@interface MyDataStructure : NSObject <Traversable>
@property (nonatomic, strong) NSMutableArray *data;
- (instancetype)initWithData:(NSArray *)data;
@end
@implementation MyDataStructure
- (instancetype)initWithData:(NSArray *)data {
self = [super init];
if (self) {
_data = [NSMutableArray arrayWithArray:data];
}
return self;
}
- (id<Iterator>)createIterator {
return [[MyIterator alloc] initWithData:self.data];
}
@end
// 具体的迭代器类,实现Iterator协议
@interface MyIterator : NSObject <Iterator>
@property (nonatomic, strong) NSMutableArray *data;
@property (nonatomic, assign) NSUInteger currentIndex;
- (instancetype)initWithData:(NSMutableArray *)data;
@end
@implementation MyIterator
- (instancetype)initWithData:(NSMutableArray *)data {
self = [super init];
if (self) {
_data = data;
_currentIndex = 0;
}
return self;
}
- (BOOL)hasNext {
return self.currentIndex < self.data.count;
}
- (id)next {
if ([self hasNext]) {
id object = self.data[self.currentIndex];
self.currentIndex++;
return object;
}
return nil;
}
@end
// 使用示例
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSArray *dataArray = @[@"A", @"B", @"C", @"D"];
MyDataStructure *dataStructure = [[MyDataStructure alloc] initWithData:dataArray];
id<Iterator> iterator = [dataStructure createIterator];
while ([iterator hasNext]) {
id object = [iterator next];
NSLog(@"%@", object);
}
}
return 0;
}
优化策略代码示例
复用迭代器对象(对象池示例)
// 迭代器对象池类
@interface IteratorPool : NSObject
@property (nonatomic, strong) NSMutableArray<MyIterator *> *pool;
+ (instancetype)sharedPool;
- (MyIterator *)getIteratorWithData:(NSMutableArray *)data;
- (void)returnIterator:(MyIterator *)iterator;
@end
@implementation IteratorPool
+ (instancetype)sharedPool {
static IteratorPool *sharedPool = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedPool = [[IteratorPool alloc] init];
sharedPool.pool = [NSMutableArray array];
});
return sharedPool;
}
- (MyIterator *)getIteratorWithData:(NSMutableArray *)data {
if (self.pool.count > 0) {
MyIterator *iterator = self.pool.lastObject;
[self.pool removeLastObject];
iterator.data = data;
iterator.currentIndex = 0;
return iterator;
}
return [[MyIterator alloc] initWithData:data];
}
- (void)returnIterator:(MyIterator *)iterator {
iterator.data = nil;
iterator.currentIndex = 0;
[self.pool addObject:iterator];
}
@end
// 修改后的使用示例
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSArray *dataArray = @[@"A", @"B", @"C", @"D"];
MyDataStructure *dataStructure = [[MyDataStructure alloc] initWithData:dataArray];
IteratorPool *pool = [IteratorPool sharedPool];
MyIterator *iterator = [pool getIteratorWithData:dataStructure.data];
while ([iterator hasNext]) {
id object = [iterator next];
NSLog(@"%@", object);
}
[pool returnIterator:iterator];
}
return 0;
}
分块遍历示例
// 修改MyDataStructure类支持分块遍历
@interface MyDataStructure : NSObject <Traversable>
@property (nonatomic, strong) NSMutableArray *data;
@property (nonatomic, assign) NSUInteger chunkSize;
- (instancetype)initWithData:(NSArray *)data chunkSize:(NSUInteger)chunkSize;
@end
@implementation MyDataStructure
- (instancetype)initWithData:(NSArray *)data chunkSize:(NSUInteger)chunkSize {
self = [super init];
if (self) {
_data = [NSMutableArray arrayWithArray:data];
_chunkSize = chunkSize;
}
return self;
}
- (id<Iterator>)createIterator {
return [[MyChunkIterator alloc] initWithData:self.data chunkSize:self.chunkSize];
}
@end
// 分块迭代器类
@interface MyChunkIterator : NSObject <Iterator>
@property (nonatomic, strong) NSMutableArray *data;
@property (nonatomic, assign) NSUInteger chunkSize;
@property (nonatomic, assign) NSUInteger currentIndex;
@property (nonatomic, assign) NSUInteger currentChunkIndex;
- (instancetype)initWithData:(NSMutableArray *)data chunkSize:(NSUInteger)chunkSize;
@end
@implementation MyChunkIterator
- (instancetype)initWithData:(NSMutableArray *)data chunkSize:(NSUInteger)chunkSize {
self = [super init];
if (self) {
_data = data;
_chunkSize = chunkSize;
_currentIndex = 0;
_currentChunkIndex = 0;
}
return self;
}
- (BOOL)hasNext {
return self.currentIndex < self.data.count;
}
- (id)next {
if (![self hasNext]) {
return nil;
}
NSUInteger endIndex = MIN(self.currentIndex + self.chunkSize, self.data.count);
NSArray *chunk = [self.data subarrayWithRange:NSMakeRange(self.currentIndex, endIndex - self.currentIndex)];
self.currentIndex = endIndex;
self.currentChunkIndex++;
return chunk;
}
@end
// 使用分块遍历示例
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSArray *dataArray = @[@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H"];
MyDataStructure *dataStructure = [[MyDataStructure alloc] initWithData:dataArray chunkSize:3];
id<Iterator> iterator = [dataStructure createIterator];
while ([iterator hasNext]) {
NSArray *chunk = [iterator next];
NSLog(@"Chunk %lu: %@", (unsigned long)self.currentChunkIndex, chunk);
}
}
return 0;
}