为什么在将 %1$s 用于 String(format:) 时会得到 EXC_BAD_ACCESS

问题描述

我有一个 localized string 看起来像这样:

String(format: "unable_to_reach".localized(),name) //name is a string. I have also tried just "x"

key/value 文件中的 localize 对如下所示:

"unable_to_reach" = "Unable to reach %1$s";

现在,有时这有效,有时它会因 EXC_BAD_ACCESS 错误而崩溃。为什么是这样? %1$s 不应该用于 string 值吗?

解决方法

格式说明符 %1$s%s,其中插入了位置说明符 $1%s 是以空字符结尾的 C 字符串的格式说明符。如果你改为传递一个 Swift 字符串,那么糟糕的事情就会发生。不要那样做。 (如果 Swift 字符串不包含任何空字节,则可能会导致缓冲区溢出。)

您希望 %@(或 %$1@,以保留位置说明符。)

有关详细信息,请参阅 string format specifiers 上的文档。