【问题标题】:Using NSUserDefaults in block leads to memory crash在块中使用 NSUserDefaults 会导致内存崩溃
【发布时间】:2015-04-07 12:07:30
【问题描述】:

我正在使用 AfNetworking 发出 POST 请求。在完成块中收到响应后,进度 hud 视图被关闭,并且在 NSUserDefaults 中保存了一些数据。但是当我运行应用程序时,UI 不会更新,并一直等到应用程序因内存问题而崩溃。

这是我的示例代码:

[[HTAPIClient sharedClient] POST:requestAddress
                      parameters:nil
                         success:^(NSURLSessionDataTask *task, id responseObject) {
                              if ([responseObject objectForKey:@"default_source"]) {
                                  NSUserDefaults *usd = [NSUserDefaults standardUserDefaults];
                                  [usd setObject:[responseObject objectForKey:@"default_source"] forKey:@"payViaCreditCard"];
                                  [usd synchronize];
                              }

                              NSDictionary *sources = [responseObject objectForKey:@"sources"];
                              if (sources) {
                                  NSArray *data = [sources objectForKey:@"data"];
                                  if (data) {
                                      // some code
                                  }
                              }

                              [self.navigationController popViewControllerAnimated:YES];
                              [SVProgressHUD dismiss];
                         }
                         failure:^(NSURLSessionDataTask *task, NSError *error) {
                             // some failure
                         }];

知道如何解决这个问题吗?

感谢您的提前!

编辑:

XCode 到底是这样说的:

“iPhone”上的应用“MyApp”意外退出。 来自调试器的消息:因内存错误而终止

【问题讨论】:

  • 我还没有签入AFN2,但我猜是在主线程上调用了成功块(除非你已经改变它)?
  • 是的,在主线程上调用了成功块,我没有改变行为。
  • 在使用之前,您能否检查一下当您将响应对象转换为 NSDictionary 时是否会发生这种情况?
  • 当我检查中断时,我可以看到块中的所有代码都运行成功。但是 UI 没有任何反应。
  • 您应该确定内存错误的来源。到目前为止,它不在您与我们共享的代码中。可能是对内存的一些浪费(例如同时将许多大型资产(例如图像、电影等)加载到内存中),使用巨大的循环和自动释放对象,或者一些无限递归。通过使用调试器、断点或日志语句,确定它被捆绑的地方。

标签: ios afnetworking nsuserdefaults afnetworking-2


【解决方案1】:

试试这个

 NSDictionary *sources = [responseObject objectForKey:@"sources"];
                          if (sources) {
                              NSArray *data = [sourcesobjectForKey:@"data"];
                              if (data) {
                                  // some code
                              }
                          }

 dispatch_async(dispatch_get_main_queue(), ^{
           [SVProgressHUD dismiss];
         [self.navigationController popViewControllerAnimated:YES];

        });

【讨论】:

  • 不,它没有帮助。当我注释使用 NSUserDefaults 的代码(3 行)时,会发生有趣的事情,UI 更新正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 2016-02-21
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多