• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

iphone - iOS 数组未完全填充

[复制链接]
菜鸟教程小白 发表于 2022-12-12 10:22:52 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在使用这两种递归方法来查找某个文件夹中文件和目录的路径

- (NSMutableArray *)getFilePathsFromDirectoryNSString *)directory{
NSMutableArray *contents = [[NSMutableArray alloc] init];
NSArray *arr = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directory error:nil];
for (NSString *file in arr) {
    BOOL isDir;
    [[NSFileManager defaultManager] fileExistsAtPath:[directory stringByAppendingPathComponent:file] isDirectory:&isDir];
    if (!isDir) {
        [contents addObject:[directory stringByAppendingPathComponent:file]];
    }
    else{
        [contents addObject:[directory stringByAppendingPathComponent:file]];
        [contents addObject:[self getFilePathsFromDirectory:[directory stringByAppendingPathComponent:file]]];
    }
}
return contents;
}

- (NSString *)getPathForItemNamedNSString *)name arrayNSMutableArray *)arr{
NSString *str;
if (name) {
    for (NSString *s in arr) {
        if ([s isKindOfClass:[NSString class]]) {
            if ([[s lastPathComponent] isEqualToString:name]) {
                return s;
            }
        }
    }
    for (NSMutableArray *aq in arr) {
        if ([aq isKindOfClass:[NSMutableArray class]]) {
            str = [self getPathForItemNamed:name array:aq];
            return str;
        }
    }
}
return str;
}

但问题是,经过一定数量的子目录(3-5)后,这将停止返回任何路径并返回 (null)。我觉得这与由于某种原因在返回之前没有填充所有目录的数组有关。以下是我如何称呼这些

NSMutableArray *paths = [self getContentsOfPaths:[self downloadsDir]];

path = [self getPathForItemNamed:[tableView cellForRowAtIndexPath:indexPath].textLabel.text array:paths];
NSLog(@"%@", path);



Best Answer-推荐答案


您的 getPathForItemNamed: 方法存在两个问题:

  • 当它无法通过名称找到文件时,它返回一个未初始化变量 str 的值。这是未定义的行为 - 您需要在初始化时将 str 设置为 nil。事实上,您根本不需要 str(请参阅下面的修复)。
  • 当它发现它的第一个子目录时,它假定它要查找的文件必须在该子目录中,即使它不是。无论 getPathForItemNamed: 的一级递归调用返回什么,都成为顶级调用的返回结果。这很糟糕:如果您要查找的文件位于第二个子目录的子树中,您将永远找不到它!

您可以通过以下方式修复您的方法:

- (NSString *)getPathForItemNamedNSString *)name arrayNSMutableArray *)arr{
    if (!name) return nil;
    for (NSString *s in arr) {
        if ([s isKindOfClass:[NSString class]]) {
            if ([[s lastPathComponent] isEqualToString:name]) {
                return s;
            }
        }
    }
    for (NSMutableArray *aq in arr) {
        if ([aq isKindOfClass:[NSMutableArray class]]) {
            str = [self getPathForItemNamed:name array:aq];
            // Return something only when you find something
            if (str) return str;
        }
    }
    return nil; // You do not need str at all.
}

关于iphone - iOS 数组未完全填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15938331/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap