调试和发布版本之间的不同行为

时间:2012-02-19 11:30:26

标签: objective-c ios

我正在使用SOCKit库为我的应用实现网址路由器。我有一个自定义Router类,它跟踪所有有效路由,并实现match方法,给定路由NSString,将其与相应的视图控制器匹配。为了简化操作,可匹配的视图控制器必须实现Routable协议,这需要initWithState:方法,该方法将NSDictionary作为参数。这是相关的代码:

- (id)match:(NSString *)route
{
  for (NSArray *match in routePatterns) {
    const SOCPattern * const pattern = [match objectAtIndex:kPatternIndex];
    if ([pattern stringMatches:route]) {
      Class class = [match objectAtIndex:kObjectIndex];

      NSLog(@"[pattern parameterDictionaryFromSourceString:route]: %@", [pattern parameterDictionaryFromSourceString:route]);

      UIViewController<Routable> *vc;
      vc = [[class alloc] initWithState:[pattern parameterDictionaryFromSourceString:route]];
      return vc;
    }
  }
  return nil;
}

当我使用debug配置运行应用时,[pattern parameterDictionaryFromSourceString:route]会产生预期效果:

[pattern parameterDictionaryFromSourceString:route]: {
    uuid = "e9ed6708-5ad5-11e1-91ca-12313810b404";
}

另一方面,当我使用release配置运行应用程序时,[pattern parameterDictionaryFromSourceString:route]会生成一个空字典。我真的不确定如何调试这个。我检查了自己的代码,看看debugrelease构建之间是否存在明显差异,但无效,并且还查看了SOCKit source code。想法?谢谢!

1 个答案:

答案 0 :(得分:2)

我今天刚刚遇到这个问题。在我的案例中,问题是Release构建了被阻止的断言,但在-performSelector:onObject:sourceString:-parameterDictionaryFromSourceString:中这是重要的一行:

NSAssert([self gatherParameterValues:&values fromString:sourceString],
  @"The pattern can't be used with this string.");

当断言转换为无操作时,消失,收集永远不会发生。没有参数值,没有太多发生!我将其更改为以下内容(并将向GitHub回购提交问题):

if( ![self gatherParameterValues:&values fromString:sourceString] ) {
  NSAssert(NO, @"The pattern can't be used with this string.");
  return nil;
}

<小时/> 编辑:报告为issue #13