【问题标题】:CoreData Fetch Request casting [Any] to [AnyObject] produces memory leakCoreData Fetch Request 将 [Any] 转换为 [AnyObject] 会产生内存泄漏
【发布时间】:2017-07-27 07:13:02
【问题描述】:

我正面临无法理解的内存泄漏 光纤通道

调用跟踪:

  1. +0x196 callq "DYLD-STUB$$NSManagedObjectContext.fetch (NSFetchRequest) throws -> [A]"
  2. +0x8c callq "_arrayForceCast ([A]) -> [B]"
  3. +0xde callq "Collection.map ((A.Iterator.Element) throws -> A1) throws -> [A1]"
  4. +0x19e callq "ContiguousArray.reserveCapacity(Int) -> ()"
  5. +0xaa callq "_ContiguousArrayBuffer.init(uninitializedCount : Int, minimumCapacity : Int) -> _ContiguousArrayBuffer"
  6. +0x42 callq "ManagedBufferPointer.init(_uncheckedBufferClass : AnyObject.Type, minimumCapacity : Int) -> ManagedBufferPointer"
  7. +0x0f callq "swift_slowAlloc"
  8. +0x04 callq "DYLD-STUB$$malloc"
  9. +0x13 callq "malloc_zone_malloc"
  10. +0x8f movzbl 71543(%rip), %eax

编辑:

我进一步研究了代码,我发现真正的泄漏是当我尝试在 coredata 获取请求中将类型 [Any] 强制转换为 [AnyObject] 时

func fetchEntity<T: NSManagedObject>(entityClass:T.Type,setPredicate:NSPredicate?) -> [AnyObject]
{
    let entityName = NSStringFromClass(entityClass)
    let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: entityName)
    fetchRequest.predicate = setPredicate
    fetchRequest.returnsObjectsAsFaults = false

    var result:[AnyObject] = []
    do
    {
        result = try cdh.managedObjectContext.fetch(fetchRequest) --> right here is the leak, when i cast the return object of [Any] to [AnyObject]

    }catch let error as NSError
    {
        debugPrint("error in fetchrequest is",error)
        result = []
    }

    return result
}

编辑: @乔恩,库巴

Model.getEntities(entityType: EX_TEACHER.self, completion: {[unowned self] entityobjects in
            self.teacherList = entityobjects
    })

//在模型类中

 class func getEntities<T: NSManagedObject>(entityType: T.Type,completion: ([AnyObject]) -> Void)
{
    let  teacherList = coreDataOperation.fetchEntity(entityClass: entityType, setPredicate: nil)

    completion(teacherList)

}

// cdh.managedObjectContext 代码

lazy var cdh:CoreDataStore = {
    let cdh = CoreDataStore()
    return cdh
}()

class CoreDataStore: NSObject{
lazy var managedObjectContext: NSManagedObjectContext = {
    // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
    let coordinator = self.persistentStoreCoordinator
    var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
    managedObjectContext.persistentStoreCoordinator = coordinator
    return managedObjectContext
}() }

【问题讨论】:

  • 当你调用这个 fetchEntity 函数时,请粘贴一个代码。你在执行选择器?取 unretainedValue?
  • 您使用哪个上下文进行抓取?刚刚为这个 fetch 创建了什么?
  • 用请求的代码编辑。

标签: ios swift core-data memory-leaks swift3


【解决方案1】:

经过大量编译和谷歌搜索。我放弃并下载了新的 xcode 8.3 版。 (之前是 8.1)

然后我重新测试了项目并猜猜是什么.....? 没有泄漏了。嗯,我们可以猜到是 xcode 8.1 版本的问题。

编辑:

调试

已解决的问题 macOS 和 iOS 模拟器的内存调试器修复了包含枚举类型字段或从某些 Objective-C 框架类继承的类的 Swift 类的错误内存泄漏报告。 (27932061) iOS、watchOS 和 tvOS 应用程序仍可能发生错误报告。请参阅下面的已知问题中的 (29335813)。

已知问题 iOS、watchOS 和 tvOS 应用程序的内存调试器可以在调试包含枚举类型字段的 Swift 类或从某些 Objective-C 框架类继承的类时报告错误的内存泄漏。 (29335813)

apple Xcode 8.3 release notes

【讨论】:

  • 你试过 8.2 吗?有没有内存问题?
  • 感谢您深入研究并坚持解决此问题。我有一种预感,旧版本报告了一些错误(并且读到几个人也提到了这一点),但这证实了这一点。少一件事我需要担心自己,帮了我!
  • 谢谢.. 很高兴能帮到你。相信更多的人正面临这个问题。我希望他们能在这里找到一些帮助。
【解决方案2】:

试试这个代码

        do
        {

        var result: AnyObject = try cdh.managedObjectContext.fetch(fetchRequest) 
       let resultMirror = Mirror(reflecting: result) 
       print(resultMirror.subjectType)    //gives you the return type  from coredata


        }catch let error as NSError
        {
            debugPrint("error in fetchrequest is",error)
            result = []
        }

【讨论】:

  • 我的问题是关于内存泄漏而不是返回类型,这个答案是无关的,反正这是镜像类型输出-> Array
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2011-02-21
  • 2011-01-17
  • 1970-01-01
相关资源
最近更新 更多