下面的代码在 walker = [fileManager enumeratorAtPath:directory];
处崩溃。代码在第一次调用 refresh
时执行正常,但在第二次(和后续)调用时崩溃。
关于我可能做错了什么有什么想法吗?
- (void)refresh
{
NSString* directory = nil;
NSFileManager* fileManager = nil;
NSDirectoryEnumerator* walker = nil;
if(files == nil)
files = [[NSMutableArray alloc] init];
else
[files removeAllObjects];
ASSERT(files != nil);
if(files == nil) goto EARLY_EXIT;
fileManager = [[NSFileManager alloc] init];
ASSERT(fileManager != nil);
if(fileManager == nil) goto EARLY_EXIT;
directory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
ASSERT(directory != nil);
if(directory == nil) goto EARLY_EXIT;
ASSERT(directory != nil);
walker = [fileManager enumeratorAtPath:directory];
ASSERT(walker != nil);
if(walker == nil) goto EARLY_EXIT;
NSString* file;
while((file = [walker nextObject]) != nil)
{
BOOL isDirectory = YES;
if([fileManager fileExistsAtPath:file isDirectory:&isDirectory] && !isDirectory)
[files addObject:file];
}
EARLY_EXIT:
//if(walker != nil)
// [walker release];
if(fileManager != nil)
[fileManager release];
//if(directory != nil)
// [directory release];
}
最佳答案
事实证明,在 iOS 和 10.5 及更高版本中,您不应使用 [NSFileManager defaultManager]
了。使用 Cocoa 将近 15 年让我对这个很感兴趣。我会将其留作对其他人的警告 -- TechZen
尽管您在这段代码中犯下了许多违反良好编程习惯的错误,但您真正的问题在于:
fileManager = [[NSFileManager alloc] init];
NSFileManger 在每个应用程序中都是一个单例。你永远不会自己初始化它。正确获取单例的方法是:
fileManager=[NSFileManager defaultManager];
... 返回单例。但是,您通常不会理会属性或变量,而只是这样使用它:
walker = [[NSFileManager defaultManager] enumeratorAtPath:directory];
罢工><罢工>罢工> 您知道不应该在发布代码中使用断言,对吧?
关于iphone - NSFileManager 和 NSDirectoryEnumerator 崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5252354/