【问题标题】:Objective-C Fast Enumeration Search Doesn't BreakObjective-C 快速枚举搜索不会中断
【发布时间】:2013-01-30 01:33:14
【问题描述】:

我正在尝试在树中找到匹配的对象,因此我使用的是 ObjC 快速枚举。问题是我的方法找到匹配的值,点击返回线,然后将值设置为 nil 并继续迭代。这是我的方法:

+ (INONode *)findByUUID:(NSString*)uuid fromRootNode:(INONode*)node
{    
    for (INONode * childNode in [node children]) {
        if ([[node uniqueID] isEqualToString:uuid]) {
            break;
        }
        else {
            [INONode findByUUID:uuid fromRootNode:childNode];
        }
    }

    return node;
}

当我通过设置断点来跟踪代码执行时,中断被击中,然后转到返回行,然后返回到继续迭代的语句。我在这里错过了什么?

【问题讨论】:

  • 您在调试发布版本吗?
  • 不,它处于正常开发模式...
  • 我的意思是,“运行”方案是否使用“调试”构建配置?
  • 是的,它是调试版本。

标签: objective-c cocoa fast-enumeration


【解决方案1】:

由于您的方法是递归的,return 会将您返回到循环中 ifelse 分支并继续搜索。

按照目前的实现方式,您的方法将永远只返回传递给它的节点。唯一的return 语句是return node,而node 永远不会被修改。

这是您可以做到的一种方法:

+ (INONode *)findByUUID:(NSString*)uuid fromRootNode:(INONode*)node
{   
    // Check the root node
    if ([[node uniqueID] isEqualToString:uuid]) {
        return node;
    }

    // Check each child
    for (INONode * childNode in [node children]) {
        node = [INONode findByUUID:uuid fromRootNode:childNode];
        if (node) {
            return node;
        }
    }

    return nil;
}

【讨论】:

  • 这可以通过在调试器经过每个return时查看调用堆栈来确认。
  • 那么,我敢问...让 method 返回的最佳方法是什么?我是否需要从另一个方法调用递归方法?
  • 你需要实际使用递归调用返回的值。请参阅我的更新答案以了解您可以做到的一种方式。
猜你喜欢
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
相关资源
最近更新 更多