NSDictionary类改变,如果在外部Singleton举行?

我正在观察一个有点残忍的行为:我有一个ViewController以编程的方式构build一个View。 为此,我已经存储了UILabels的名字,这些名字将被显示在一个单例外部类中的NSDictionary中。 不幸的是,如果我想使用loadView中的值,NSDictionary是不可访问的。 所以我做了一些testing:NSDictionary和它的内容在init中是可用的,而类当然是NSCFDictionary。 如果我在loadView中看看它有时是NSCFDictionary,有时也CALayer或NSString? 我绝对不知道发生了什么? 这是我使用的代码:

- (id) init { self = [super initWithNibName:nil bundle:nil]; if (self) { UITabBarItem *tbi = [self tabBarItem]; [tbi setTitle:@"xxx"]; } NSEnumerator *num = [[[ValueDispatcher dispatcher] labelDic] keyEnumerator]; NSLog(@"Class(init): %@", [[[ValueDispatcher dispatcher] labelDic] class]); NSLog(@"No: %i", [[[ValueDispatcher dispatcher] labelDic] count]); for (id key in num) { NSLog(@"Key %@ Value %@", key, [[[ValueDispatcher dispatcher] labelDic] valueForKey:key]); } return self; } - (void)loadView { NSLog(@"Class(loadview)1: %@", [[[ValueDispatcher dispatcher] labelDic] class]); NSLog(@"No: %i", [[[ValueDispatcher dispatcher] labelDic] count]); NSEnumerator *num = [[[ValueDispatcher dispatcher] labelDic] keyEnumerator]; for (id key in num) { NSLog(@"Key34 %@ Value %@", key, [[[ValueDispatcher dispatcher] labelDic] valueForKey:key]); } ... 

init和loadView之间的哪一点可以或将会改变一个NSDictionary? 顺便说一句,另一个信息可能是重要的:如果我使用上面的代码和NSDictionary由外部服务填充一切工作正常。 但是,如果我从一个存储的plist在启动过程中填充NSDictionary失败,我看着描述的行为…

如果我在loadView中看看它有时是NSCFDictionary,有时也CALayer或NSString?

这(通常)意味着你有一个引用计数的问题,或者你没有正确注销你的观察者 – 假设你从来没有设置字典。 运行僵尸启用仪器。

init和loadView之间的哪一点可以或将会改变一个NSDictionary?

在那个时候,你发布的代码可能会发生很多事情。

只要您的单身人士需要,您将需要保留该字典。

如果你使用ARC,只要确保伊娃和/或财产强大。

如果你没有使用ARC,并且你有一个属性设置器来为你pipe理这个,确保你实际上使用了这个setter。

如果没有ARC,你直接设置你的伊娃,只要确保保留字典(并释放旧的,如果有的话)