如我在对Rob Mayoff的回答中所述,任何遇到使用os_signpost()
出现问题的人,这里提供了一个我写的包装类:
import Foundation
import os
import _SwiftOSOverlayShims
public final class Signpost {
private final let log: OSLog
public init(log: OSLog) {
self.log = log
}
public final func begin(name: StaticString, dso: UnsafeRawPointer = #dsohandle, idObject: AnyObject? = nil) {
if #available(iOS 12.0, *) {
signpost(.begin, dso: dso, name: name, idObject: idObject)
}
}
public final func begin(name: StaticString, dso: UnsafeRawPointer = #dsohandle, idObject: AnyObject? = nil, _ format: StaticString, _ arguments: CVarArg...) {
if #available(iOS 12.0, *) {
signpost(.begin, dso: dso, name: name, idObject: idObject, format, arguments)
}
}
public final func event(name: StaticString, dso: UnsafeRawPointer = #dsohandle, idObject: AnyObject? = nil) {
if #available(iOS 12.0, *) {
signpost(.event, dso: dso, name: name, idObject: idObject)
}
}
public final func event(name: StaticString, dso: UnsafeRawPointer = #dsohandle, idObject: AnyObject? = nil, _ format: StaticString, _ arguments: CVarArg...) {
if #available(iOS 12.0, *) {
signpost(.event, dso: dso, name: name, idObject: idObject, format, arguments)
}
}
public final func end(name: StaticString, dso: UnsafeRawPointer = #dsohandle, idObject: AnyObject? = nil) {
if #available(iOS 12.0, *) {
signpost(.end, dso: dso, name: name, idObject: idObject)
}
}
public final func end(name: StaticString, dso: UnsafeRawPointer = #dsohandle, idObject: AnyObject? = nil, _ format: StaticString, _ arguments: CVarArg...) {
if #available(iOS 12.0, *) {
signpost(.end, dso: dso, name: name, idObject: idObject, format, arguments)
}
}
@available(iOS 12.0, *)
private final func signpost(_ type: OSSignpostType, dso: UnsafeRawPointer = #dsohandle, name: StaticString, idObject: AnyObject? = nil) {
guard log.signpostsEnabled else { return }
let signpostID = getSignpostId(forObject: idObject)
os_signpost(type, dso: dso, log: log, name: name, signpostID: signpostID)
}
@available(iOS 12.0, *)
private final func signpost(
_ type: OSSignpostType,
dso: UnsafeRawPointer,
name: StaticString,
idObject: AnyObject? = nil,
_ format: StaticString,
_ arguments: [CVarArg])
{
guard log.signpostsEnabled else { return }
let signpostID = getSignpostId(forObject: idObject)
guard signpostID != .invalid && signpostID != .null else { return }
let ra = _swift_os_log_return_address()
name.withUTF8Buffer { (nameBuf: UnsafeBufferPointer<UInt8>) in
nameBuf.baseAddress!.withMemoryRebound(to: CChar.self, capacity: nameBuf.count) { nameStr in
format.withUTF8Buffer { (formatBuf: UnsafeBufferPointer<UInt8>) in
formatBuf.baseAddress!.withMemoryRebound(to: CChar.self, capacity: formatBuf.count) { formatStr in
withVaList(arguments) { valist in
_swift_os_signpost_with_format(dso, ra, log, type, nameStr, signpostID.rawValue, formatStr, valist)
}
}
}
}
}
}
@available(iOS 12.0, *)
private final func getSignpostId(forObject idObject: AnyObject?) -> OSSignpostID {
if let idObject = idObject {
return OSSignpostID(log: log, object: idObject)
}
return .exclusive
}
}
%@
代替%f
。 - Kamran