NSLocalizedString - 格式不是字符串文字而没有格式参数(xcode)

时间:2011-04-25 20:11:10

标签: iphone ios objective-c xcode4 foundation

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

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

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

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

4 个答案:

答案 0 :(得分:6)

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

  

NSString * myString =   NSLocalizedString(@“更新   现在“,@”立即更新“);

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

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

答案 1 :(得分:4)

NSLocalizedString是一个宏,实际上是;

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

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

如果你愿意,你可以保留它......

答案 2 :(得分:1)

你根本不应该使用initWithFormat:,因为你没有处理格式字符串。

但是如果你使用它,总是这样使用它:

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

否则,风险是NSLocalizedString的结果包含字符串格式说明符(如%d或其他内容),这会导致您的应用崩溃。

答案 3 :(得分:0)

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

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

NSString* myString = NSLocalizedString(@"Update Now",@"Update Now Item");