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

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() } } } `

By volodymyr.gorlov at June 8, 2018, 8:19 p.m. (reply...)

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!