CoreData获取请求转换[Any]到[AnyObject]会产生内存泄漏

iSw*_*ift 10 memory-leaks core-data ios swift swift3

我正面临内存泄漏,无法理解PFB

在此输入图像描述

通话追踪:

  1. + 0x196 callq"DYLD-STUB $$ NSManagedObjectContext.fetch(NSFetchRequest)抛出 - > [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
}
Run Code Online (Sandbox Code Playgroud)

编辑:@ Jon,库巴

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

//在模型类中

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

    completion(teacherList)

}
Run Code Online (Sandbox Code Playgroud)

// 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
}() }
Run Code Online (Sandbox Code Playgroud)

iSw*_*ift 6

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

然后我重新测试了这个项目,猜猜是什么.....?没有泄漏了.好吧,我们可以猜测它是xcode 8.1版本问题.

编辑:

调试

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

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

apple Xcode 8.3发行说明