如何优化目录列表? (enumeratorAtPath和递归调用contentsOfDirectoryAtPath)

我写了一个方法(getDirTree1),它使用建议的类NSDirectoryEnumerator和nextObject方法列出根目录中的所有目录。不过,虽然这是不可接受的运行使用大量的内存(主要是民营类NSPathStore2):如何优化目录列表? (enumeratorAtPath和递归调用contentsOfDirectoryAtPath)

-(void) getDirTree1:(NSString*)directoryPath { 

NSDirectoryEnumerator *dirEnum = [self->fileManager enumeratorAtPath:derectoryPath];

NSString *filePath;

NSString *fullFilePath;

while ((filePath = [ dirEnum nextObject ]) != nil) {

fullFilePath = [ directoryPath stringByAppendingPathComponent:filePath ];

NSLog(@"%@ \n", fullPath);

}

}

假设这是因为对象NSDirectoryEnumerator,我重写方法(getDirTree2)。现在使用递归方法,NSArray类和objectEnumerator方法。 但是再次使用了大量的内存。

-(void) getDirTree2:(NSString*)directoryPath { 

NSArray *contents = [ self->fileManager contentsOfDirectoryAtPath:directoryPath error:NULL ];

NSEnumerator *enumeratorContent [ contents objectEnumerator ];

NSString *file;

BOOL fileIsDirectory = FALSE;

while ((file = [ enumeratorContent nextObject ])) {

NSLog(@"%@ \n", [ directoryPath stringByAppendingPathComponent: file ]);

if ([ self->fileManager fileExistAtPath:[ directoryPath stringByAppendingPathComponent:file ] isDirectory:&fileIsDirectory ] && fileIsDirectory)

[ self getDirTree2:[ directoryPath stringByAppendingPathComponent: file ] ];

}

}

我错过了什么(也许我必须dealloc /保留一些对象)以及如何做得更好。 谢谢。

回答:

[directoryPath stringByAppendingPathComponent:filePath];返回自动释放对象。由于它发生在如此紧密的循环中,所有这些对象都在累加,并造成大量内存占用。你所需要做的就是更频繁地去除它们。您可以将方法更改为不使用自动释放,或者你可以只创建你自己的,紧自动释放池,像这样:

while ((filePath = [ dirEnum nextObject ]) != nil) { 

NSAutoreleasePool* pool = [NSAutoreleasePool new];

fullFilePath = [ directoryPath stringByAppendingPathComponent:filePath ];

NSLog(@"%@ \n", fullPath);

[pool drain];

}

这将确保所有的发布尽快你不再需要它,避免循环过程中物体的堆积。

(有趣的旁注:NSPathStore2是与用于存储路径型串NSString(这是一类簇)的私有类这就是我如何知道哪些方法有错。)

回答:

对于使用自动人引用计数,如果以下(这应该是andyvn22的答案ARC等效)不为你工作:

while ((filePath = [ dirEnum nextObject ]) != nil) { 

@autoreleasepool {

fullFilePath = [ directoryPath stringByAppendingPathComponent:filePath ];

NSLog(@"%@ \n", fullPath);

}

}

我能够这样做,而不是

解决呢

filePath = [ dirEnum nextObject ]); 

while (filePath != nil) {

@autoreleasepool {

fullFilePath = [ directoryPath stringByAppendingPathComponent:filePath ];

NSLog(@"%@ \n", fullPath);

filePath = [ dirEnum nextObject ]);

}

}

代码没有尽可能优雅,但节省内存。


更新:最近又有了这个问题,什么工作更好的是这样的:

file = [dirEnum nextObject]; 

while (file) {

@autoreleasepool {

fullFilePath = [ directoryPath stringByAppendingPathComponent:filePath ];

NSLog(@"%@ \n", fullPath);

filePath = [ dirEnum nextObject ]);

}

}

回答:

,可轻松使用NSDirectoryEnumerator为documented here和shown here

以上是 如何优化目录列表? (enumeratorAtPath和递归调用contentsOfDirectoryAtPath) 的全部内容, 来源链接: utcz.com/qa/263846.html

回到顶部