【问题标题】:Apple LLVM compiler 4.0 freeze xcode and app when print XML (NSLog)Apple LLVM 编译器 4.0 在打印 XML (NSLog) 时冻结 xcode 和应用程序
【发布时间】:2012-07-27 11:07:03
【问题描述】:

我更新了 xcode 4.4(使用 Apple LLVM 编译器 4.0),从那时起,当我尝试在控制台中打印 XML 时,xcode 和应用程序(在模拟器中)会阻止用户交互......我需要等待 30 秒或更长时间才能完成(我什么都做不了)

我正在使用 AFNetworking 和 TBXML,但问题不在解析中,因为如果我删除解析,问题继续存在。

所以我尝试了 NSOperationQueue、NSBlockOperation、grand dispatch central ... 什么都没有,仍然冻结。

是因为XML太大了??? (...我需要打印 XML 来调试和测试)

1º 请求并打印 XML

- (void) doRequestPOST:(NSString*)URL params:(NSString*)params withSuccess:(void(^)(BOOL,id))successBlock{

(....)

AFHTTPRequestOperation *op = [sharedAPI HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {

            NSString* xml = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

            //>>>>>PROBLEM HERE<<<<< if i remove next line (nslog) the problem does not occur
            NSLog(@"\n\nResponse \nURL :\n%@\nXML :\n%@\n \n",operation.request.URL,xml);
            [xml release];

            TBXML * tbxml = [TBXML newTBXMLWithXMLData:responseObject error:nil];
            [self saveCookiesFromHTTPHeaderFields:[operation response] withTBXML:tbxml.rootXMLElement];

            if (successBlock) {
                successBlock(TRUE,responseObject);
            }
}

2º 将请求请求并解析 来自“successBlock(TRUE,responseObject);”的响应

[self doRequestPOST:stringURL params:nil withSuccess:^(BOOL success, id response) {

        if (success) {

            //will parse response

            [self.dictionaryCategoryContents setObject:[Parser parseVodContent:response] forKey:idCategory];
            if (responseBlock){
                responseBlock (YES,[dictionaryCategoryContents objectForKey:idCategory]);
            }

        }else {

            if (responseBlock){
                responseBlock (NO,response);
            }
        }
    }];

【问题讨论】:

  • XML 有多大? (登录[responseObject length])。
  • [响应对象长度] 44419

标签: objective-c xml nslog xcode4.4 llvm-4.0


【解决方案1】:

2012 年 8 月 7 日发布的 4.4.1 似乎已修复此问题。

【讨论】:

    【解决方案2】:

    我目前遇到了同样的问题。每当我 NSLog 一个大字符串时,我只会看到 XCode 和模拟器挂起(沙滩球)。但如果我等待 2-3 分钟,应用程序将继续运行。

    XCode 4.4 似乎存在一个错误,其他开发人员报告了相同的行为: http://openradar.appspot.com/11972490

    【讨论】:

      【解决方案3】:

      如果您需要记录调试响应(或错误报告),那么我认为您应该将 responseObject 写入缓存目录(或 iOS 下的任何等效文件夹)中的文件,如果那是操作系统)。然后您可以访问此文件以查看响应是什么。唯一要克服的问题是如何防止文件夹变得太大;可能会在应用启动时或定期删除所有以前写入的文件。

      您可以使用[NSData writeToURL:atomically:] 方法编写响应,这样会更快,因为它不需要先转换为字符串。

      【讨论】:

      • 没用 :( ,我已经尝试 writeToURL 或 writeToFile.. 用 stringWithContentsOfURL 加载,问题继续
      • 您的意思是当您编写responseObject 而不将其转换为字符串时它仍然会冻结?
      • 嗯...可能我做错了,所以我定义了一个 URL 的路径并在我加载 [NSString stringWithContentsOfURL:storeUrl encoding:NSASCIIStringEncoding 错误后写入 [dataXML writeToURL:storeUrl atomically:YES] :&error] 或 [NSData dataWithContentsOfURL:storeUrl] 但仍以两种方式冻结
      • 如果您删除 XML 的 all 日志记录,冻结就消失了吗?我想知道这是否是通过网络实际加载数据...
      • 是的,如果我删除所有 nslog 就会消失
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      相关资源
      最近更新 更多