我有一个非常奇怪的问题,我似乎无法看到原因。
我在NSDictionary上有一个类别扩展,它有一个名为title的方法。该方法的工作原理如下:
- (NSString*)title {
return self[@"title"];
}
这使我能做的是,在NSDictionary上有一个方便的方法来返回一个标题。
以下是使用示例:
NSDictionary *config = [mConfigManager currentConfig];
if ([config title]) {
return [config title];
}
return @"";
现在这就是事情变得奇怪的地方。在iOS 10上,标题方法有时返回nil。如果返回nil,则对config[@"title"]
的手动调用将返回该值。结果我调整了我的代码如下:
NSDictionary *config = [mConfigManager currentConfig];
if ([config title]) {
return [config title];
}
else if(config[@"title"])
{
return config[@"title"];
}
return @"";
使用上面的代码,这总是返回标题(如果存在)。但是,它有时仅适用于else if
案例,而不适用于类别版本。
所以问题是:
为什么类别在与手动调用完全相同的情况下不返回值?
这使得这个更奇怪的是有时会工作:请参阅以下日志输出:
首先点击
(lldb) po [config title]
Joe Bloggs
第二次点击
(lldb) po [config title]
nil
(lldb) po config[@"title"]
Joe Bloggs
注意:上述日志均在应用的同一实例中运行,通过选择表格视图单元格触发。因此,这可以消除任何可能发生重新分配或重新分配的情况。
然而,我注意到的一件事是控制台不会输出config
的内容而是返回以下错误:
<object returned empty description>
然而,变量视图完全显示了对象和所有变量。该对象在变量列表中定义为NSDictionaryM
。
对此的任何帮助都将受到广泛赞赏。
提前致谢
答案 0 :(得分:1)
很可能系统中的某些东西,可能(可能)来自Apple,还在类别中的title
上创建了NSDictionary
方法。如果在类别中定义了两个具有相同名称的方法,则未定义哪个方法将被执行。 (当我在私人类别中将pop
添加到NSMutableArray
时,我个人遇到了这种情况,而且我的程序以不可预测的方式变得混乱。)
您必须在类别方法前加上前缀(即mc_title
或其他)。 Apple 应该为他们的私有方法添加前缀,但它们没有,所以你必须这样做。
(当然,想要将此方法添加到NSDictionary
强烈建议你真的应该创建一个小数据类而不是使用字典,但这是一个完全独立的问题。)