NSDictionary保留崩溃

时间:2012-09-14 15:30:52

标签: iphone memory-management nsdictionary

我有一个NSDictionary,通过解析存储值。我在-viewDidLoad分配和存储值。并访问-viewWillAppear中的值。它工作得很好。

然后,我UIPageControlUIScrollView。滚动UIScrollView时,我再次访问同一个字典,它崩溃说

[CFString respondToSelector:]: send to deallocated....

- (void) viewDidLoad {

    [super viewDidLoad];
    scoresDict = [[NSDictionary alloc] initWithDictionary:[scoreObj scores]];
}

- (void)loadScrollViewWithPage:(int)page {

    if (page < 0) 

        return;

    if (page >= kNumberOfPages)

    return;

    NSLog(@“scoresDict %@”,scoresDict);
}

我尝试在同一个函数中使用retain,但它没有用完。 copy,它也没有用。任何帮助,将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

您没有这么说,但看起来所有这些方法都是从自定义UIViewController或UIScrollViewController子类的实例调用的。

最可能的问题是该实例本身未被保留。

首次从笔尖加载视图时,会调用-viewDidLoad和-viewWillAppear。但是,有可能在这些调用和对-loadScrollViewWithPage的调用之间发生垃圾收集,并且没有任何对象与视图控制器实例本身有任何连接。

如果是这种情况,在scoresDict上使用copy或retain将无法解决问题。您需要确保复制或保留视图控制器实例本身。找出需要保留视图控制器的对象,并确保它被保留。

测试这是否是问题的快速方法:在应用程序委托中创建“myViewController”属性。在viewDidLoad中,添加一行:

[[[UIApplication sharedApplication] delegate] setMyViewController:self];

如果这可以解决您的问题,则意味着问题是视图控制器被释放。但这并不意味着这是你最好的解决方案 - 它只是一个诊断。你需要弄清楚应该保留你的视图控制器的内容,并确保它这样做。