Posts

Post marked as solved
2 Replies
196 Views
Hi, I have a log to file function that as part of the logline inserts the current datetime as below: class func logToFile(message: String, logInfo: LogInfo = appLogInfo, type: OSLogType = .default) {           let formatter = DateFormatter()     formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"     formatter.timeZone = TimeZone(secondsFromGMT: TimeZone.current.secondsFromGMT())     formatter.locale = Locale(identifier: "en_US_POSIX")     let localDate = formatter.string(from: Date())           let logMessage = "\(localDate) [\(logInfo.category)] \(message)\n"           let documentDirPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]           let filePath = "\(documentDirPath)/\(logFileName)"           if let fileHandle = FileHandle.init(forWritingAtPath: filePath), let data = logMessage.data(using: .utf8) {       fileHandle.seekToEndOfFile()       fileHandle.write(data)     }   } and it is always called from a serial queue: Log.serialQueue.async {       logToFile(message: message, logInfo: logInfo, type: type)     } Lately however, I am getting some crashes and I managed to catch one in the debugger. It happens when deallocating the local DateFormatter when exiting the logToFile function. Xcode stops at the end of the function: And the thread indicates that it is inside NSDateFormatter dealloc and clicking on the ici::Dataformat destructor, the assembly code shows this: And in the inspector, we can see that localDate is half-baked, it only contains the year and day: I have found some posts on DateFormatter not being thread safe but that was way in the past. In my case I only want to convert a Date() to String. Something is not working as expected and suggestions on how to improve it would be very welcome. Thanks in advance
Posted Last updated
.