2

我有一个 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,它也没有奏效。任何帮助,将不胜感激。谢谢!

4

1 回答 1

0

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

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

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

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

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

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

如果这解决了您的问题,则意味着问题在于视图控制器被释放。但这并不意味着这是您的最佳解决方案,但这只是一种诊断。您需要弄清楚什么应该保留您的视图控制器并确保它这样做。

于 2012-11-05T18:25:15.477 回答