我编写了一个方法(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 ] ];
}
}
我错过了什么(也许我必须释放/保留一些对象)以及如何做得更好。
谢谢。
[directoryPath stringByAppendingPathComponent:filePath];
返回一个自动释放的对象。由于它发生在如此紧密的循环内,因此所有这些对象都会累加并导致出现问题的大量内存占用。要解决这个问题,您所要做的就是更频繁地摆脱它们。您可以将方法更改为不使用自动释放的方法,或者您可以创建自己的紧密自动释放池,如下所示:
while ( ( filePath = [ dirEnum nextObject ] ) != nil ) {
NSAutoreleasePool* pool = [NSAutoreleasePool new];
fullFilePath = [ directoryPath stringByAppendingPathComponent:filePath ];
NSLog( @"%@ \n", fullPath );
[pool drain];
}
这将确保所有内容都已发布as soon当您不再需要它时,避免在循环期间堆积对象。
(有趣的旁注:NSPathStore2
是一个与以下相关的私有类NSString
(这是一个类簇)用于存储路径类型字符串。这就是我如何知道哪个方法有问题。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)