gpt4 book ai didi

iphone - iOS数组没有被完全填满

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:43:44 26 4
gpt4 key购买 nike

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

- (NSMutableArray *)getFilePathsFromDirectory:(NSString *)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 *)getPathForItemNamed:(NSString *)name array:(NSMutableArray *)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);

最佳答案

getPathForItemNamed: 方法有两个问题:

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

这里是你如何修正你的方法:

- (NSString *)getPathForItemNamed:(NSString *)name array:(NSMutableArray *)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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com