类别扩展iOS 10 +

时间:2017-04-27 00:22:16

标签: ios objective-c nsdictionary objective-c-category

我有一个非常奇怪的问题,我似乎无法看到原因。

我在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

对此的任何帮助都将受到广泛赞赏。

提前致谢

1 个答案:

答案 0 :(得分:1)

很可能系统中的某些东西,可能(可能)来自Apple,还在类别中的title上创建了NSDictionary方法。如果在类别中定义了两个具有相同名称的方法,则未定义哪个方法将被执行。 (当我在私人类别中将pop添加到NSMutableArray时,我个人遇到了这种情况,而且我的程序以不可预测的方式变得混乱。)

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

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