类别扩展不一致 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 而不是为此使用字典,但这是一个完全独立的问题。 )
我有一个非常棘手的运行问题,我似乎看不出原因。
我在 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 而不是为此使用字典,但这是一个完全独立的问题。 )