2017-04-27 80 views
1

我有一个很奇怪的问题,我似乎无法看到原因。类别扩展不一致iOS 10+

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

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

这是什么让我做的,是有一个方法在NSDictionary传回标题。

下面是使用的例子:

NSDictionary *config = [mConfigManager currentConfig]; 

if ([config title]) { 

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

现在,这是事情变得奇怪。在iOS 10上,标题方法有时返回零。如果返回零,则手动拨打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 

注:上述日志都运行d通过选择表视图单元格触发应用程序的相同实例。因此,这消除了任何可能发生释放或重新分配的情况。

一两件事,但是我已经注意到了,就是控制台不会输出config内容,而是返回了以下错误:

<object returned empty description> 

变量视图但充分显示了对象和所有变量。该对象在变量列表中定义为NSDictionaryM

任何与此有关的帮助将大规模赞赏。

在此先感谢

+1

用重命名你的方法前缀,看看你是否可以重现这一点。另外,'[mConfigManager currentConfig]'里面发生了什么? –

+0

该行在返回'nil'时没有中断,因此它给人的印象是它没有被调用。 '[mConfigManager currentConfig]'只返回一个NSDictionary对象。 –

回答

1

很有可能一些在系统一样,可能从苹果(可能),也于类别创建于NSDictionary一个title方法。当在类别中定义了两个具有相同名称的方法时,未定义哪一个将被执行。 (当我在私人类别中添加popNSMutableArray时,我亲自遇到过这种情况,并且我的程序以不可预测的方式出现故障。)

您必须为您的类别方法(即mc_title或其他)加上前缀。苹果应为前缀他们的私人方法,但他们不,所以你必须。

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

+0

我会试一试,看看是否是这个问题 –

+0

关于对象的设计,代码最初是由其他人编写的,我已被引入修复bug。就我个人而言,我也会走下课程路线:) –