【问题标题】:iOS crash when creating multiple threads in a for loop在 for 循环中创建多个线程时 iOS 崩溃
【发布时间】:2013-06-08 11:00:02
【问题描述】:

这是一个非常简单的例子。我无法解释为什么这些代码行会导致崩溃。我只想在 for 循环中创建多个线程。 在 AppDelegate 中:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    for (int i = 0; i < 5; i++) {

        [self performSelectorInBackground:@selector(workInBackground)
                               withObject:nil];
    }
    return YES;
}

-(void)workInBackground{

}

应用程序仅偶尔崩溃(lldb 崩溃、iPhone Simulator 5.0 - 6.1、Xcode 版本 4.6.2)。我使用 ARC。

谁能解释这种行为?

更新

我“解决”了这个问题。当我在每次测试前执行清理时,不再发生崩溃。

【问题讨论】:

  • 什么是崩溃日志和堆栈跟踪?
  • 是的,堆栈跟踪会很有用...您是否考虑过使用 GCD 代替?
  • @Manu 是正确使用调度队列 - 在 GCD 上阅读。
  • 我知道存在 GCD 或 Operation Queues 的可能性,并且它们是 Apple 推荐的。但我只是想了解手动线程的使用。
  • 应用程序崩溃,没有任何崩溃日志或堆栈跟踪。

标签: ios multithreading crash


【解决方案1】:

我不知道问题出在哪里,但您应该检查一下: What are the differences between didFinishLaunchingWithOption and viewDidLoad

如果您有多个要在后台运行的任务,也可以使用 NSOperationQueue

【讨论】:

  • 问题不在于使用didFinishLaunchingWithOption或viewDidLoad。这种情况下的行为是相同的。
  • 我“解决了”这个问题。当我在每次测试前执行清理时,不再发生崩溃。
【解决方案2】:

好的,所以如果您阅读苹果文档,他们会说:“在状态恢复发生后但在应用程序的窗口和其他 UI 呈现之前调用此方法。在此方法返回后的某个时间点,系统会调用另一个您的应用程序委托的方法将应用程序移动到活动(前台)状态或后台状态。”这意味着实际上此时的应用程序尚未处于前台状态,您应该在此处存储启动线程的意图,然后系统调用方法- (void)applicationDidBecomeActive:(UIApplication *)application,此时您绝对可以确定您的应用程序处于前台状态并处于活动状态,现在如果您记录了启动线程的意图,您可以这样做,并且不要忘记重置意图变量状态

【讨论】:

  • 这不是问题。当我在 viewController 的 viewDidLoad 方法中执行此操作时,也会发生同样的事情。
猜你喜欢
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多