Home > Net >  Occasional EXC_BAD_ACCESS crash
Occasional EXC_BAD_ACCESS crash

Time:01-03

Every now and then, my app crashes with a EXC_BAD_ACCESS when accessing a Dictionary, although the object exists and has been accessed many times before the crash without any problem.

It is created at start of app with:

static var whiteLabelling = [String : String]()

and is never recreated afterwards.

Entries may be added, changed and removed at runtime, and, depending on the situation, it can run through a FareEngine.whiteLabelling.removeAll()

Multiple threads access it simultaneously as well without crashing.

What can be the reason for this occasional crash? enter image description here

CodePudding user response:

You should ensure that you always read from the same thread.

You could use always main thread with a basic DispatchQueue.main.async{}. That way, it's always in the same queue (main thread/thread 0).

Another possible way would be using a private queue, ensuring it's always in that same queue.

  • add a (private) property to FareEngine
static private var whiteLabellingQueue = DispatchQueue(label: "com.yourApp.whiteLabellingQueue, qos: .userInitiated) //or any other `qos`
  • Make whiteLabelling private (to ensure there is no more issue with other code accessing it):
private static var whiteLabelling: [String: String]
  • Then, make access possible:
func setWhiteLabelling(value: String, forKey key: String) {
    whiteLabellingQueue.sync {
        self.whiteLabelling[key] = value
    }
}
  • Finally, make writing possible:
func getWhiteLabelling(forKey key: String) -> String? {
    let value: String?
    whiteLabellingQueue.sync {
        value = self.whiteLabelling[key]
    }
    return value
}

Now, when you want to access the values:

let req = FareEngine.getWhiteLabelling(forKey: "GPSACCURACY")

Since, you can have a remove all, do the same:

func cleanWhiteLabelling() {
    whiteLabellingQueue.sync {
        self.whiteLabelling.removeAll()
    }
}
  • Related