2011-10-11 102 views
-2

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

这里是我的代码

我想追加的NSMutableArray。

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

有人可以帮助我。

+1

没有更多的信息。什么类型的“饲料”?什么类型是'html'?什么类型是'itemName'和它的对象是什么类型?请给我们所有的细节,让我们开始了解你在做什么。 – PengOne

+2

@PengOne:我认为这些类型非常明显。'feed'是某种类型的集合(很可能是'NSArray'),'html'是'NSMutableString','itemName'又是一些集合类型,很可能是'NSArray'。 –

+1

@Kevin:声明“我试图追加NSMutableArray”使这个问题变得很不清楚。此外,把这些信息拼出来是一种很好的做法(如果OP做到了,他可能会回答他自己的问题)。 – PengOne

回答

2

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

所以您选择发送必须是这样的:

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

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

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

我的情况下添加的description消息的对象不是直接在字符串,要明确。

+0

谢谢你的帮助。有效! – HardCode

+0

然后接受答案,这是你想要的:) – Geoffroy

+0

是啊,你知道stackoverflow不会让你立即接受答案!你需要等待至少10分钟才能接受答案。我会标记它作为回答一旦它通过的时间;) – HardCode

3

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

您应该使用-appendString:来代替。

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

+0

谢谢你指出。我会尝试这个选项。 – HardCode

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]]; } 
相关问题