3

执行以下操作时,我收到“格式不是字符串...”消息:

NSString* string1 = [[NSString alloc] initWithFormat:NSLocalizedString(@"Update Now", @"Update Now Item")];
NSString* string2 = [[NSString alloc] initWithFormat:NSLocalizedString(@"Register", @"Register Now")];

它工作正常,即应用程序不会在设备或模拟器上崩溃,并且本地化文本也可以正常显示。

我试图理解为什么我会收到这个特定的错误消息。据我所知,这就是您在 Objective C 中使用本地化字符串的方式。

4

4 回答 4

6

使用本地化字符串的最简单方法是:

NSString* myString = NSLocalizedString(@"立即更新",@"立即更新");

现在请记住 myString 是自动释放的 - 您通常需要一个字符串。

在示例中,您给出的字符串被保留(因为您使用 initWithFormat)。猜测“立即更新”等将显示在用户 UI 中,可能通过 UILabel 您不需要保留的字符串 - 当您将字符串分配给 UILabel 时,它将自动保留它(因为文本已存储在保留财产中)

于 2011-04-25T21:04:29.150 回答
4

NSLocalizedString 是一个宏,实际上是;

[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]

那么,为什么你需要另一个 NSString 除非你做一些像格式替换这样的后处理,它无论如何都会返回一个 NSString !

如果你喜欢,你可以保留它...

于 2011-04-25T21:04:37.603 回答
1

您根本不应该initWithFormat:在此处使用,因为您不处理格式字符串。

但是,如果您使用它,请始终像这样使用它:

[[NSString alloc] initWithFormat:@"%@", NSLocalizedString(@"Update Now", @"Update Now Item")];

否则,风险在于结果NSLocalizedString包含字符串格式说明符(like%d或其他内容),这会使您的应用程序崩溃。

于 2011-04-25T20:14:42.037 回答
0

编译器报告的警告是正确的。从返回的字符串NSLocalizedString(@"Update Now", @"Update Now Item") 不是格式字符串,因为它内部没有格式说明符。

正如 Ican Zilb 在另一个答案中所说,最好的解决方案是直接使用:

NSString* myString = NSLocalizedString(@"Update Now",@"Update Now Item");
于 2011-04-29T06:56:57.580 回答