类别扩展不一致 iOS 10+

Inconsistency in Category extensions iOS 10+

我有一个非常棘手的运行问题,我似乎看不出原因。

我在 NSDictionary 上有一个类别扩展,它有一个名为 title 的方法。该方法的工作原理如下:

- (NSString*)title {
    return self[@"title"];
}

这允许我做的是在 NSDictionary 上有一个方便的方法 return 标题。

这是一个使用示例:

NSDictionary *config = [mConfigManager currentConfig];

if ([config title]) {

    return [config title];
}
return @"";

现在事情就这样开始了运行ge。在 iOS 10 上,标题方法 有时 return 没有。在 return 为 nil 的情况下,手动调用 config[@"title"] return 的值。结果我调整了我的代码如下:

NSDictionary *config = [mConfigManager currentConfig];

if ([config title]) {

    return [config title];
}
else if(config[@"title"])
{
    return config[@"title"];
}
return @"";

使用上面的代码,这总是 return 标题(如果存在)。然而,它有时只适用于 else if 情况,而不适用于类别版本。

所以问题是:

为什么类别在执行与手动调用完全相同的操作时不会 return 值?

让这变得更稳定运行的原因是它有时会起作用:请参阅以下日志输出:

第一次点击

(lldb) po [config title]
Joe Bloggs

第二次点击

(lldb) po [config title]
nil
(lldb) po config[@"title"]
Joe Bloggs

注意: 以上记录了同一应用程序实例期间的两个 运行,通过选择 table 视图单元触发。因此,这消除了任何可能发生释放或 re-allocation 的情况。

但是我注意到的一件事是,控制台不会输出 config 的内容,而是 return 出现以下错误:

<object returned empty description>

然而,变量视图完全显示了 object 和所有变量。 object 在变量列表中定义为 NSDictionaryM

如有任何帮助,我们将不胜感激。

提前致谢

很可能系统中的其他东西,可能(可能)来自 Apple,也在类别中的 NSDictionary 上创建了 title 方法。当category中定义了两个同名方法时,执行哪一个是不确定的。 (当 Apple 在私有类别中将 pop 添加到 NSMutableArray 时,我个人遇到了这种情况,并且我的程序以不可预测的方式失控。)

您必须为您的类别方法添加前缀(即 mc_title 或其他)。 Apple 应该 为他们的私有方法添加前缀,但他们没有,所以你必须这样做。

(当然,想要将此方法添加到 NSDictionary 强烈建议您确实应该创建一个小数据 class 而不是为此使用字典,但这是一个完全独立的问题。 )