2012-02-27 5 views
4

NSStringをNSDataに変換するさまざまな方法があります。iOS:NSStringをNSDataに変換する別のアプローチ

NSString *req_string = @"I am a NSString."; 
NSData *req_data = [NSData dataWithBytes:[req_string UTF8String] length:[req_string length]]; 
// or 
NSData *req_data_alt = [req_string dataUsingEncoding:NSUTF8StringEncoding]; 

これらの2つのアプローチの違いはありますか?

+1

楽しい:1つはNSDataのクラスメソッドで、もう1つはNSStringのインスタンスメソッドです – doNotCheckMyBlog

答えて

6

後者(NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding])は私が推奨するオプションです。

なぜですか?

効率性という人もいます。この場合、文字列インスタンスメソッドを使用してNSDataオブジェクトを作成すると、高度に最適化されたAppleのコードへの単一のobj-cメッセージディスパッチが必要になります。もう1つのケース(classメソッドを使用して新しいNSDataオブジェクトを作成する場合)では、文字列オブジェクトへの2つのメッセージディスパッチとNSDataクラスオブジェクトへの1つのメッセージディスパッチが必要です。

しかし、ランタイムは大きく異なる可能性はなく、たとえそうであっても、エンコードのコストは文字列の長さに基づいており、NSDataオブジェクトを作成するためにどのメソッドを使用するのかに基づいていません。

NSStringでインスタンスメソッドを使用したいと思う本当の理由は、意味と明快さです。

のは、これらのオプションの疑似英語翻訳を考えてみましょう:

  • [string DataUsingEncoding:NSUTF8StringEncoding]:ねえ、文字列、私はあなたがUTF8エンコーディングを使用して私に自分のNSDataのコピーを与えたいです。さて、ありがとう、そこに置いてください - いいえ、敷物にはありません。
  • [NSData dataWithBytes:[req_string UTF8String] length:[req_string length]]:文字列!あなたのUTF8バイトすべてを教えてください。ええ、私もあなたの長さが必要です。 Sec。 NSData、ここに乗って、私はあなたにこの物語を拾う必要があります。私のドアの玄関を去って、それをデータオブジェクトに変換してください。文字列、待ってください。あなたに明確に思える何かを「

壊れないのですか?

+0

面白い説明。アドバイスありがとうございます。 – Raptor

4

あなたの最初の呼び出しが正しくありません。[req_string length]はその-UTF8Stringの、バイト単位で、必ずしも長さではありません。あなたが本当のを取得するためにstrlenを使用する必要があります。-UTF8Stringの長さではなく

この例では-[NSString dataUsingEncoding:]を使用して優れていることを示している - 間違って取得する1つの少ないパラメータがあります。また

注意:のためのドキュメントは、返されたデータが他のマシンに送信されることを意図した "外部表現"であると述べており、前面にBOM(バイトオーダーマーカー)が含まれている可能性があります。実際には、BOMはUTF8にとって役に立たないよりも悪いので、-dataUsingEncoding:には含まれていません。別のエンコーディングを選択する場合は、それを見ることができます。

関連する問題