【问题标题】:NSLocale NSLocaleCalendar causes EXC_BAD_ACCESSNSLocale NSLocaleCalendar 导致 EXC_BAD_ACCESS
【发布时间】:2025-12-11 03:30:01
【问题描述】:

我正在使用关注文档 -https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSLocale_Class/index.html#//apple_ref/occ/clm/NSLocale/localeIdentifierFromComponents:

如果链接没有跳转到页面的正确部分,请查找localeIdentifierFromComponents(_:)

XCode 7.2 游乐场

print(NSLocale.localeIdentifierFromComponents([
    NSLocaleLanguageCode:"en",
    NSLocaleCountryCode:"US",
    NSLocaleCalendar: NSJapaneseCalendar
])) 
//EXC_BAD_ACCESS

print(NSLocale.localeIdentifierFromComponents([
    NSLocaleLanguageCode:"en",
    NSLocaleCountryCode:"US",
]))
//"en_US"

如果我使用逆运算

print(NSLocale.componentsFromLocaleIdentifier("en_US@calendar=japanese"))
//["kCFLocaleCountryCodeKey": "US", "kCFLocaleLanguageCodeKey": "en", "calendar": "japanese"]

NSLocaleCalendar 映射到 kCFLocaleCalendarKey,而不是“日历”

那么是我做错了什么还是文档错了?

【问题讨论】:

  • 不是你。好像你可以这样说:print(NSLocale.localeIdentifierFromComponents([ NSLocaleLanguageCode:"en", NSLocaleCountryCode:"US", "calendar": "japanese" ])) 如果你想解决这个问题

标签: ios swift nslocale


【解决方案1】:

我会说文档是错误的(您使用的是他们使用的确切示例),或者更有可能是 Foundation 中的一个实际错误(Xcode 7.2.1,Swift 2),至少是 Swift 访问它- 这并不能确认 Objective-C 访问是否有效(尽管我猜它们是相同的)。

我建议提交bug report

这是我的游乐场,以确认您的错误。即使使用公历,它也在爆炸式增长。

//: Playground - noun: a place where people can play

import Foundation

let ident = NSLocale.localeIdentifierFromComponents([
    NSLocaleLanguageCode:"en",
    NSLocaleCountryCode:"US",
    ])

NSGregorianCalendar
NSJapaneseCalendar

NSLocale.componentsFromLocaleIdentifier("en_US")
NSLocale.componentsFromLocaleIdentifier("en_US@calendar=japanese")

let ident2 = NSLocale.localeIdentifierFromComponents([
    NSLocaleLanguageCode:"en",
    NSLocaleCountryCode:"US",
    NSLocaleCalendar:NSGregorianCalendar // causing EXC_BAD_ACCESS
    ])

【讨论】: