格式不是字符串文字,也不是格式参数

时间:2011-10-11 20:35:15

标签: objective-c

我得到的格式不是字符串文字,也没有格式参数编译错误。

这是我的代码

我正在尝试追加NSMutableArray。

for (int i=0; i<feed.count; i++) {
    [html appendFormat:[self.itemName objectAtIndex:i]]; }

请有人帮助我。

3 个答案:

答案 0 :(得分:3)

您使用变量作为格式字符串调用-appendFormat:。这是一个非常糟糕的主意,因为任何格式说明符(基本上是"%"后跟另一个字符的任何序列)的存在将导致-appendFormat:尝试读取varargs中的下一个参数,没有提供,因此它将从堆栈中读取垃圾内存并尝试插入它。充其量,这将是一次崩溃。在最坏的情况下,它是安全漏洞的载体。

您应该使用-appendString:代替。

注意,这假定[self.itemName objectAtIndex:i]NSString*。如果它是其他东西,您可能想要附加其描述,例如[html appendFormat:@"%@", [self.itemName objectAtIndex:i]],或者您可能希望根据它的确切类型添加其他内容。

答案 1 :(得分:2)

appendFormat:方法需要一个字符串作为第一个参数。

所以你的选择器发送必须是:

[html appendFormat:@"%@", [self.itemName objectAtIndex:i]];

虽然你也可以直接附加一个字符串:

[html appendString:[[self.itemName objectAtIndex:i] description]];

我添加了description消息,以防对象不是直接字符串,而是显式的。

答案 2 :(得分:2)

这段代码应该做什么? -[NSMutableString appendFormat:]需要format string,如@"The %@ says %@"和“填空”与其余参数。

一些较少使用的格式说明符是危险的,因为它们可以显示程序中的信息或导致程序崩溃(称为uncontrolled format string attack)。

由于这个原因(并且因为格式字符串用于汇集变量中的信息),所以总是希望格式字符串本身是文字字符串,而不是变量或数组。

所以,您可以像这样使用appendFormat:

for (int i=0; i<feed.count; i++) {
    [html appendFormat: @"%@", [self.itemName objectAtIndex:i]]; }

或者,您可以改为使用appendString:

for (int i=0; i<feed.count; i++) {
    [html appendString:[self.itemName objectAtIndex:i]]; }