NSFileManager和NSDirectoryEnumerator崩溃?

时间:2011-03-09 21:24:05

标签: iphone ios nsfilemanager

以下代码在walker = [fileManager enumeratorAtPath:directory];崩溃。代码在第一次调用refresh时执行OK,但在第二次(及后续)调用时崩溃。

关于我可能做错的任何想法?

- (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];
}

2 个答案:

答案 0 :(得分:0)

事实证明,在iOS和10.5及更高版本中,您不应再使用[NSFileManager defaultManager]了。使用Cocoa已有将近15年了。我会把它留给别人发出警告 - TechZen

尽管你在这段代码中有很多反对良好编程习惯的错误,但你真正的问题在于:

fileManager = [[NSFileManager alloc] init];

NSFileManger是每个应用程序中的单身人士。你永远不会自己初始化它。获得单身人士的正确方法是:

fileManager=[NSFileManager defaultManager];

...返回单身人士。但是,您通常不需要使用属性或变量,只需使用它即可:

walker = [[NSFileManager defaultManager] enumeratorAtPath:directory];

<击> 你知道你不应该在发布代码中使用断言,对吗?

答案 1 :(得分:0)

我发现同样的崩溃。在iOS 4.3中崩溃但在5.0中运行良好。 Blrgh。我通过代码重构使用字符串枚举器而不是url枚举器:

    NSFileManager* localFileManager = [[NSFileManager alloc] init];
    NSDirectoryEnumerator* enumerator = [localFileManager enumeratorAtPath:path];
    for (NSString* file in enumerator) {
        // do stuff...
    }
祝你好运。 (并摆脱那些得到的)。