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

Iphone NSLocalizedString-格式不是字符串文字,也没有格式参数(xcode),iphone,ios,objective-c,xcode4,foundation,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")]; 它工作正常,即应用程序不

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

NSString* string1 = [[NSString alloc] initWithFormat:NSLocalizedString(@"Update Now", @"Update Now Item")];
NSString* string2 = [[NSString alloc] initWithFormat:NSLocalizedString(@"Register", @"Register Now")];
它工作正常,即应用程序不会在设备或模拟器上崩溃,本地化文本也显示正常


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

您根本不应该在这里使用
initWithFormat:
,因为您没有处理格式字符串

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

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

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

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

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

现在请记住myString是自动释放的,这通常是字符串所需要的


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

NSLocalizedString是一个宏,实际上是一个

[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
那个么,你们到底为什么需要另一个NSString呢?除非你们做一些后处理,比如格式替换,否则它会返回一个NSString


如果愿意,您可以保留它…

编译器报告的警告是正确的。从
NSLocalizedString(@“立即更新”,“立即更新项目”)
返回的字符串不是格式字符串,因为它内部没有格式说明符

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

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

+1.使用
initWithString:
而不是
initWithFormat:
也可以。或者您可以使用
[[NSString alloc]initWithString:NSLocalizedString(@“立即更新”,“立即更新”)
如果您实际传递的是格式字符串,则只应使用
-initWithFormat:
。不,他不应该这样做。在这种情况下,他根本不应该使用
initWithFormat: