iOS中缓慢的默认访问崩溃

时间:2014-03-17 14:16:01

标签: ios nsuserdefaults

我已经在iOS上编程了3年,大量使用核心数据。但是,我以前从来没有遇到像这样的崩溃,也不知道为什么会这样。这个当前的应用程序只有4个非常简单的视图控制器,只保存到nsdefaults大约5个不同的时间。我感到困惑的错误是“关键ClientState的慢速默认访问时间为0.037632秒,容差为0.020000”。我已经注意到我的代码中的问题在于我的代码中存在的问题。此外,在视图控制器加载后很长时间。按下按钮后会发生此过程。最后,这种崩溃只发生了一半的时间,这意味着有时代码实际上没有崩溃。

 NSUserDefaults *ab = [NSUserDefaults standardUserDefaults];
        NSString *frcrat = [ab objectForKey:@"frcrat"];

        NSString *lapper = [alertView textFieldAtIndex:0].text;

        spinner.hidden = NO;
        [spinner startAnimating];
        delem = NULL;
        delem = [[NSMutableArray alloc] init]; //Line after this line gives error Thread 1: Exc_bad_access (code = 1, address=0xe0bb2f85)
        NSString *urlString = [[NSString stringWithFormat:@"http://www.mywebsite.com/enum.php?fracat=%@&num=%@&sap=%@", frcrat, lapper, _sna]stringByAddingPercentEscapesUsingEncoding : NSUTF8StringEncoding ];
        NSXMLParser *Parser = [[[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:urlString]] autorelease];
        [Parser setDelegate:self];
        [Parser parse];

2 个答案:

答案 0 :(得分:1)

我假设此代码放在视图控制器初始化的某个位置。

您获得的警告意味着视图控制器加载时间过长,这显然是由于代码中的initWithContentsOfURL:调用。

正如您可以阅读hereinitWithContentsOfURL: 阻止,这意味着您永远不应该在主线程上调用它。您应该异步执行XML解析器初始化。类似的东西:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSString *urlString = [[NSString stringWithFormat:@"http://www.mywebsite.com/enum.php?fracat=%@&num=%@&sap=%@", frcrat, lapper, _sna]stringByAddingPercentEscapesUsingEncoding : NSUTF8StringEncoding ];
    NSXMLParser *parser = [[[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:urlString]] autorelease];
    [parser setDelegate:self];
    [parser parse];
}

答案 1 :(得分:0)

它甚至与nsuser默认值无关。这是因为字符串_sna。我改为在nsuserdefaults中保存该字符串,并在需要时将其重新加载为NSString * snameri。感谢Apple调试器给我一个不恰当的错误。