我正在使用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]
会生成一个空字典。我真的不确定如何调试这个。我检查了自己的代码,看看debug
和release
构建之间是否存在明显差异,但无效,并且还查看了SOCKit source code。想法?谢谢!
答案 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。