Error "EXC_BAD_ACCESS (code=EXC_I386_GPFLT)" when fetching zones using `CKDatabase.fetchAllRecordZones`
Originator: | volodymyr.gorlov | ||
Number: | rdar://40947902 | Date Originated: | June 8 2018 |
Status: | Open | Resolved: | |
Product: | macOS + SDK | Product Version: | Xcode 10.0 beta (10L176w) |
Classification: | Hang | Reproducible: | 100% |
Summary: Error "EXC_BAD_ACCESS (code=EXC_I386_GPFLT)" when fetching zones using `CKDatabase.fetchAllRecordZones` Same code works well on Xcode Version 9.4 (9F1027a) Steps to Reproduce: 1. Make "One window project" with NSButton 2. Set handler to NSButton to call `CKDatabase.fetchAllRecordZones` method (see sample code). Expected Results: No errors addressed memory management. Actual Results: "EXC_BAD_ACCESS (code=EXC_I386_GPFLT)" error is observed. Version/Build: Version 10.0 beta (10L176w) ``` extension CKDatabase { public func fetchAllRecordZones(completion: @escaping Result<[CKRecordZone]>.Completion) { fetchAllRecordZones { value, error in if let error = error { completion(.failure(error)) } else if let value = value { completion(.success(value)) <<<<<<<<< ERROR HERE! } else { assertionFailure() } } } public func fetchAllRecordZones(on queue: DispatchQueue, completion: @escaping Result<[CKRecordZone]>.Completion) { fetchAllRecordZones { result in queue.async { completion(result) } } } } ```
Comments
Please note: Reports posted here will not necessarily be seen by Apple. All problems should be submitted at bugreport.apple.com before they are posted here. Please only post information for Radars that you have filed yourself, and please do not include Apple confidential information in your posts. Thank you!
I found workaround by recreating new Array from results Array.
Old code:
`
public func fetchAllRecordZones(completion: @escaping Result<[CKRecordZone]>.Completion) { fetchAllRecordZones { value, error in if let error = error { completion(.failure(error)) } else if let value = value { completion(.success(value)) } else { assertionFailure() } } } `
`
public func fetchAllRecordZones(completion: @escaping Result<[CKRecordZone]>.Completion) { fetchAllRecordZones { value, error in if let error = error { completion(.failure(error)) } else if let value = value { let result = Array(value) // WORKAROUND <<<<<<<<<<<<<<<<< completion(.success(result)) } else { assertionFailure() } } } `