DateComponentsFormatter 在组件的字符串上崩溃
DateComponentsFormatter Crash On String From Components
我正在从 DateComponentsFormatter 中获取崩溃报告。我无法复制自己,所以如果有人有解决方案或重现它的方法,我将不胜感激。
0 CoreFoundation 0x1a0142a48 __exceptionPreprocess + 220 (NSException.m:199)
1 libobjc.A.dylib 0x19fe69fa4 objc_exception_throw + 56 (objc-exception.mm:565)
2 Foundation 0x1a0452e78 -[NSDateComponentsFormatter _canonicalizedDateComponents:withCalendar:usedUnits:withReferenceDate:] + 1436 (NSDateComponentsFormatter.m:101)
我调用它的代码如下所示:
let formatter = DateComponentsFormatter()
// `units` is a user customizable array of NSCalendar.Unit, limited to a subset of [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
formatter.allowedUnits = units
// `style` is a user choosable selection of the DateComponentsFormatter.UnitsStyle enum
formatter.unitsStyle = style
// `components` is a user customizable array of Calendar.Component, limited to a subset of [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
let dateComponents = Calendar.current.dateComponents(components, from: date1, to: date2)
print(formatter.string(from: dateComponents) ?? "")
我还没有发现任何引发此类异常的组合或日期。对该函数的所有调用都发生在主线程上。
我写了一个小单元测试,它在一个测试断点处停止了,日志:
指定带间隙的位置单位不明确,因此不受支持
func test_formatter() {
func randomUnits() -> NSCalendar.Unit {
let availableUnitsRawValues: [UInt] = [1 << 2, 1 << 3, 1 << 12, 1 << 4, 1 << 5, 1 << 6, 1 << 7] // Corresponding to [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
let nrUsedUnits = Int.random(in: 1 ... availableUnitsRawValues.count)
let shuffeledAvailableUnitsRawValues = availableUnitsRawValues.shuffled
let usedUnitsRawValues = shuffeledAvailableUnitsRawValues[ 0 ..< nrUsedUnits]
let usedUnitsRawValue = usedUnitsRawValues.reduce(0, |)
let usedUnits = NSCalendar.Unit.init(rawValue: usedUnitsRawValue)
return usedUnits
}
func randomStyle() -> DateComponentsFormatter.UnitsStyle {
let randomStyleIndex = Int.random(in: 0 ... 5)
let randomStyle = DateComponentsFormatter.UnitsStyle.init(rawValue: randomStyleIndex)!
return randomStyle
}
func randomDate() -> Date {
let randomDayInterval = Double.random(in: -10 ... 10)
let randomDate = Date.init(timeIntervalSinceNow: randomDayInterval * 24 * 60 * 60)
return randomDate
}
func randomComponents() -> Set<Calendar.Component> {
let availableComponents: Set<Calendar.Component> = [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
let nrUsedComponents = Int.random(in: 1 ... availableComponents.count)
let shuffeledAvailableComponents = Array(availableComponents).shuffled
let usedComponents = shuffeledAvailableComponents[ 0 ..< nrUsedComponents]
return Set(usedComponents)
}
for _ in 0 ..< 10 {
let units = randomUnits()
for _ in 0 ..< 10 {
let style = randomStyle()
for _ in 0 ..< 10 {
let components = randomComponents()
let formatter = DateComponentsFormatter()
// `units` is a user customizable array of NSCalendar.Unit, limited to a subset of [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
formatter.allowedUnits = units
// `style` is a user choosable selection of the DateComponentsFormatter.UnitsStyle enum
formatter.unitsStyle = style
// `components` is a user customizable array of Calendar.Component, limited to a subset of [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
let dateComponents = Calendar.current.dateComponents(components,
from: randomDate(),
to: randomDate())
var yyy = formatter.string(from: dateComponents) ?? "" // Crash here
}
}
}
}
这里有更多信息:
我正在从 DateComponentsFormatter 中获取崩溃报告。我无法复制自己,所以如果有人有解决方案或重现它的方法,我将不胜感激。
0 CoreFoundation 0x1a0142a48 __exceptionPreprocess + 220 (NSException.m:199)
1 libobjc.A.dylib 0x19fe69fa4 objc_exception_throw + 56 (objc-exception.mm:565)
2 Foundation 0x1a0452e78 -[NSDateComponentsFormatter _canonicalizedDateComponents:withCalendar:usedUnits:withReferenceDate:] + 1436 (NSDateComponentsFormatter.m:101)
我调用它的代码如下所示:
let formatter = DateComponentsFormatter()
// `units` is a user customizable array of NSCalendar.Unit, limited to a subset of [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
formatter.allowedUnits = units
// `style` is a user choosable selection of the DateComponentsFormatter.UnitsStyle enum
formatter.unitsStyle = style
// `components` is a user customizable array of Calendar.Component, limited to a subset of [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
let dateComponents = Calendar.current.dateComponents(components, from: date1, to: date2)
print(formatter.string(from: dateComponents) ?? "")
我还没有发现任何引发此类异常的组合或日期。对该函数的所有调用都发生在主线程上。
我写了一个小单元测试,它在一个测试断点处停止了,日志:
指定带间隙的位置单位不明确,因此不受支持
func test_formatter() {
func randomUnits() -> NSCalendar.Unit {
let availableUnitsRawValues: [UInt] = [1 << 2, 1 << 3, 1 << 12, 1 << 4, 1 << 5, 1 << 6, 1 << 7] // Corresponding to [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
let nrUsedUnits = Int.random(in: 1 ... availableUnitsRawValues.count)
let shuffeledAvailableUnitsRawValues = availableUnitsRawValues.shuffled
let usedUnitsRawValues = shuffeledAvailableUnitsRawValues[ 0 ..< nrUsedUnits]
let usedUnitsRawValue = usedUnitsRawValues.reduce(0, |)
let usedUnits = NSCalendar.Unit.init(rawValue: usedUnitsRawValue)
return usedUnits
}
func randomStyle() -> DateComponentsFormatter.UnitsStyle {
let randomStyleIndex = Int.random(in: 0 ... 5)
let randomStyle = DateComponentsFormatter.UnitsStyle.init(rawValue: randomStyleIndex)!
return randomStyle
}
func randomDate() -> Date {
let randomDayInterval = Double.random(in: -10 ... 10)
let randomDate = Date.init(timeIntervalSinceNow: randomDayInterval * 24 * 60 * 60)
return randomDate
}
func randomComponents() -> Set<Calendar.Component> {
let availableComponents: Set<Calendar.Component> = [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
let nrUsedComponents = Int.random(in: 1 ... availableComponents.count)
let shuffeledAvailableComponents = Array(availableComponents).shuffled
let usedComponents = shuffeledAvailableComponents[ 0 ..< nrUsedComponents]
return Set(usedComponents)
}
for _ in 0 ..< 10 {
let units = randomUnits()
for _ in 0 ..< 10 {
let style = randomStyle()
for _ in 0 ..< 10 {
let components = randomComponents()
let formatter = DateComponentsFormatter()
// `units` is a user customizable array of NSCalendar.Unit, limited to a subset of [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
formatter.allowedUnits = units
// `style` is a user choosable selection of the DateComponentsFormatter.UnitsStyle enum
formatter.unitsStyle = style
// `components` is a user customizable array of Calendar.Component, limited to a subset of [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
let dateComponents = Calendar.current.dateComponents(components,
from: randomDate(),
to: randomDate())
var yyy = formatter.string(from: dateComponents) ?? "" // Crash here
}
}
}
}
这里有更多信息: