.-- --

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
スポンサー広告 comment(-) trackback(-)
.15 2009

MutableData の注意点

Tasaki です。

レジューム機能実装にまたまた苦労しているわけですが、
僕はファイルの出力に際して NSMutableData をよく使用します。
(C の構造体使ってると、これを利用するのが一番単純みたいなので)

そこで、今回はその中でハマった点を書き残しておきます。

initWithLength:を呼ぶと、
指定バイト分が 0 で初期化される訳ですが、
この後、appendBytes:length:とすると、
この初期化した領域の後ろにデータが追加されます。
これだとムダなバイトがファイルの先頭に生じることになり、
さらに読み込み時に問題が発生します。
(この先頭の0の原因が分からなくてハマってました…)
ということで、初めからappend... メソッドで追加していく場合は、
イニシャライザには、init を使用します。

書き込むデータサイズが固定の場合、
初めから割り当てる領域を指定して初期化しておいた方が
いいかなと思い、initをあえて使用しなかったわけなんですが…。
一方で、replace系のメソッドは範囲指定が必須なので、
コーディングが非常に面倒に感じました。


なんかいい方法ないんでしょうか?

-----------------------------------------------------------
2009 年 6 月 8 日ー追記

append系メソッドで先頭からデータを追加していきたい場合は、initWithCapacity: メソッドで初期化時に確保したい領域を明示できるようです。

また、initWithLength: で領域確保+ゼロフィルを行った場合でも、mutableBytes メソッドでデータの先頭のポインタが取得できるので、そのままデータの書き換えができる模様です。


ほしさん、どうもありがとうございました。

関連記事
スポンサーサイト

Comment

ほし
initWithLength: ではなく、initWithCapacity: を使えば、指定した空き容量を持った、サイズ 0 の mutable data ができます。
あと、mutable data の中身を書き換えたい場合は、mutableBytes メソッドでポインタを取得できます。
2009.06.07 00:03
Tasaki
情報ありがとうございます!
早速追記させていただきました。
まさか、2ヶ月も前のエントリにコメントが付くとは思ってなかったので、正直びっくりしました。
2009.06.08 10:32

Post comment

  • comment
  • secret
  • 管理者にだけ表示を許可する

Trackback

trackbackURL:http://appteam.blog114.fc2.com/tb.php/37-a17d5d76

ブログ内検索

関連リンク

製品情報

最新記事

カテゴリ

プロフィール

neoxneo



NEXT-SYSTEM iOS Developers Blog


  • UTO:
    カナダ版iPhone4Sは、マナーモードでシャッター音がならない…


  • Ehara:
    ...


  • Hayate:
    ...


  • Tasaki:
    Developer登録完了...したのはいいけど


  • Ueda:
    ...



リンク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。