【问题标题】:App freezes and terminates because of memory usage when fetching Core Data objects获取核心数据对象时,应用程序由于内存使用而冻结并终止
【发布时间】:2017-10-15 20:00:33
【问题描述】:

我有一个 iOS 应用程序,Core Data 已经运行了几个月,但在我升级到 High Sierra、Xcode 9/Swift 4 和 iOS 11 后的某个时间点,它停止了工作。我不是每天都在处理它,因为它是一个附带项目,所以我无法准确确定它何时停止工作。

当我的应用程序启动时,我在viewDidLoad 中获取所有Project 对象(我的核心数据模型的一部分)并将它们放在我的视图控制器中的projects 属性中。我用以下方法获取

func fetchProjects() -> [Project] {
    let fetchRequest = Project.fetchRequest() as! NSFetchRequest<Project>
    var projects: [Project] = []

    do {
        projects = try coreDataStack.viewContext.fetch(fetchRequest)
    } catch {
        print(error.localizedDescription)
    }

    return projects
}

问题是,应用程序只是变白并开始消耗设备的内存,然后退出并仅显示一条消息来自调试器的消息:由于内存问题而终止。如果我删除对这个方法的调用,它就会正常启动。

我将应用程序上传到 TestFlight,一个朋友说它运行良好,所以这很可能是我的问题,但我不知道是什么。

更新 1 做 Instruments 的问题是 Instruments Core Data 只能在模拟器上运行,而我的问题只有在我的设备上运行时才会出现。但是,当我在模拟器上运行它时,我没有看到任何我认为是错误的东西。

我尝试将 -com.apple.CoreData.SQLDebug 1 设置为应用程序的参数,但这也没有给我任何可疑之处。

我已经添加了我的核心数据堆栈类,所以你可以看到我是如何设置它的,虽然它很标准。

final class CoreDataStack {

    // MARK: Properties
    static let sharedInstance = CoreDataStack()

    lazy var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: Strings.CoreData.modelName)
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()

    lazy var viewContext: NSManagedObjectContext = {
        return self.persistentContainer.viewContext
    }()

    // MARK: Initialization
    private init() {
    }

    // MARK: - Saving
    func saveContext() {
        guard persistentContainer.viewContext.hasChanges else {
            return
        }

        do {
            try persistentContainer.viewContext.save()
        } catch let error as NSError {
            print("Unresolved error \(error), \(error.userInfo)")
        }
    }
}

更新 2 奇怪的是,Realm 表现出类似的行为。它不会让我获取Projects。也许是一些潜在的问题?

【问题讨论】:

  • 加载时您可能拥有多少 Project 对象?
  • 无论我有多少Projects,都会发生这种情况。在全新安装时,当我添加一个 Project 时会发生这种情况。
  • 如果您遇到单个实例的内存问题,那么这段代码没有问题。使用仪器并找出真正的问题是什么。 特别是,因为您在 Realm 中看到了同样的问题——您的问题几乎肯定在其他地方。
  • 我今天实际上格式化了我的 iPad,只是为了检查是否解决了它,确实如此,所以我想我也必须格式化我的 iPhone。这并不是我所希望的解决方案,但我对正在发生的事情一无所知。

标签: ios swift core-data realm


【解决方案1】:

好吧,看来我通过全新安装我的设备来修复它。我还没有发现错误发生的原因,但无论如何,这就是修复。

【讨论】:

    猜你喜欢
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多