如何优化目录列表? (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