objective-c – 如何优化目录列表? (enumeratorAtPath和递归调
发布时间:2020-12-16 09:36:26 所属栏目:百科 来源:网络整理
导读:我编写了一个方法(getDirTree1),它使用推荐的类NSDirectoryEnumerator和方法nextObject从根目录列出所有目录.但是当它运行不可接受时使用了大量内存(主要是私有类NSPathStore2): -(void) getDirTree1:(NSString*)directoryPath { NSDirectoryEnumerator *di
|
我编写了一个方法(getDirTree1),它使用推荐的类NSDirectoryEnumerator和方法nextObject从根目录列出所有目录.但是当它运行不可接受时使用了大量内存(主要是私有类NSPathStore2):
-(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(它是一个类集群)相关的私有类,用于存储路径类型的字符串.这就是我知道哪种方法有问题的方法.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
