2017-03-07 27 views
10

Tôi đang phải đối mặt với một rò rỉ bộ nhớ mà tôi không thể hiểu PFBCoreData Fetch Yêu cầu đúc [Bất kỳ] tới [AnyObject] sản xuất bộ nhớ bị rò rỉ

enter image description here

Gọi dấu vết:

  1. + 0x196 callq "DYLD-STUB $$ NSManagedObjectContext.fetch (NSFetchRequest) ném -> [A]"
  2. + 0x8c callq "_arrayForceCast ([A]) -> [B]"
  3. + 0xde callq "Collection.map ((A.Iterator.Element) ném -> A1) ném -> [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. + movzbl 0x8f 71.543 (% rip),% eax

enter image description here

enter image description here

Edit:

Tôi Hơn nữa điều tra mã và tôi phát hiện ra rằng rò rỉ thực sự là khi tôi cố ép buộc loại truyền [Bất kỳ] thành [AnyObject] trong yêu cầu tìm nạp coredata

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 
} 

EDIT: @ Jon, Kuba

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

// trong mô hình lớp

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

    completion(teacherList) 

} 

// cdh.managedObjectContext đang

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 
}() } 
+0

Hãy dán một mã khi u're gọi fetchEntity func này. Bạn đang thực hiện bộ chọn? Lấy unretainedValue? – Kuba

+0

Bạn đang sử dụng ngữ cảnh nào để tìm nạp? những gì vừa được tạo cho lần tìm nạp này? –

+0

được chỉnh sửa bằng mã được yêu cầu. – iSwift

Trả lời

6

Sau nhiều lần biên soạn và tìm kiếm trên google. tôi đã từ bỏ và tải xuống một phiên bản xcode mới 8.3. (trước đây là 8.1)

Sau đó, tôi đã thử lại dự án và đoán xem .....? không bị rò rỉ nữa. Vâng, chúng tôi có thể đoán rằng đó là vấn đề phiên bản xcode 8.1.

EDIT:

Debugging

vấn đề giải quyết The Memory Debugger cho MacOS và iOS Simulator các bản sửa lỗi báo cáo rò rỉ bộ nhớ sai cho các lớp Swift chứa một trong hai lĩnh vực kiểu enum, hoặc các lớp kế thừa từ các lớp khung Objective-C nhất định. (27932061) Báo cáo sai vẫn có thể xảy ra cho các ứng dụng iOS, watchOS và tvOS. Xem (29335813) trong Các vấn đề đã biết, bên dưới.

Vấn đề được Biết The Memory Debugger dành cho iOS, watchos, và tvOS các ứng dụng có thể báo cáo bộ nhớ sai rò rỉ khi gỡ lỗi lớp Swift chứa một trong hai lĩnh vực kiểu enum, hoặc lớp kế thừa từ lớp khuôn khổ Objective-C nhất định. (29335813)

apple Xcode 8.3 release notes

+0

Bạn đã thử phiên bản 8.2 chưa? Có vấn đề gì về bộ nhớ? – Sneha

+0

Kudo để tìm hiểu thông tin đó và gắn bó để tìm ra điều này. Tôi đã có một linh cảm phiên bản cũ báo cáo một số công cụ sai (và đọc một số người đề cập đến điều đó, quá), nhưng điều này xác nhận nó. Một điều ít hơn tôi cần phải lo lắng về bản thân mình, đã giúp tôi ra! – Gero

+0

Cảm ơn .. Rất vui được giúp bạn. Chắc chắn có nhiều người đang đối mặt với vấn đề này. tôi hy vọng họ tìm thấy một số trợ giúp ở đây. – iSwift

1

Hãy thử mã này

 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 = [] 
     } 
+1

Câu hỏi của tôi là về rò rỉ bộ nhớ không trả về loại, câu trả lời này là không liên quan, dù sao đây là loại đầu ra của gương-> Array iSwift