2011-10-11 16 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を追加しようとしています"というステートメントは、このことの多くを不明瞭にしています。さらに、この情報を綴ることは良い習慣です(そして、彼はおそらく彼自身の質問に答えることができました)。 – 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:は提供しなかったvarargsの次の引数を読み込もうとします。ガベージメモリをスタックから読み込み、挿入しようとしています。せいぜい、これはクラッシュになります。最悪の場合、セキュリティエクスプロイトのためのベクターです。

代わりに-appendString:を使用してください。

[self.itemName objectAtIndex:i]NSString*であることに注意してください。それ以外の場合は、その説明を追加することができます(例: [html appendFormat:@"%@", [self.itemName objectAtIndex:i]]、または正確なタイプに基づいて別のものを追加することができます。

+0

ありがとうございました。私はそのオプションを試してみる。 – HardCode

2

このコードは何をすべきですか? -[NSMutableString appendFormat:]は、@"The %@ says %@"のようにformat stringをとり、残りの引数で「空白を埋める」。

ほとんど使用されない書式指定子の中には、プログラムの情報を明らかにしたり、クラッシュさせるものがあるという点で危険です(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]]; } 
関連する問題