保存について
アプリを立ち上げた時に、前回使用した時のデータを使いたい場合があります。
やり方はいろいろあるようですが、シリアライズというものを使ってみます。
これは、インスタンスをまるごと冷凍保存しておいて、次に使うときに解凍するようなイメージの技術です。
必要なことは
・保存したいインスタンスをシリアライズに対応させる
・シリアライズする処理
・復元する処理
の3つです。
web上によい記事がいくつかあります。具体的なことはこちらに。
http://nagano.monalisa-au.org/?p=64
http://d.hatena.ne.jp/KishikawaKatsumi/20081014/1223986859
注意点は
・復元したときに参照カウンタを+1しないので、retainしておく。
・復元時にはinitWithCoderが実行される。initは実行されない。initWithCoder内で[super init]はいる。
・インスタンス変数にはシリアライズに対応していないものがある場合は、それをシリアライズ出来るようにしておく。
例えば、
A{
B
C
}
B{
D
E
}
の場合、
Aをシリアライズに対応させるには、BとCもシリアライズに対応しないといけない。
このとき、DとEをシリアライズに対応しないと〜
と芋づる式にどんどんシリアライズのコードを書くことになります。
エンコード時にシリアライズされるインスタンスの参照カウンタはどうなる?というのを疑問に思ったのでやってみました。参照カウンタは+1されます。シリアライズするとき必要になるだけなので参照カウンタは変わらないと予想したのですが、カウントされるようです。エンコードオブジェクトが消される時に-1されるのでしょう。
やり方はいろいろあるようですが、シリアライズというものを使ってみます。
これは、インスタンスをまるごと冷凍保存しておいて、次に使うときに解凍するようなイメージの技術です。
必要なことは
・保存したいインスタンスをシリアライズに対応させる
・シリアライズする処理
・復元する処理
の3つです。
web上によい記事がいくつかあります。具体的なことはこちらに。
http://nagano.monalisa-au.org/?p=64
http://d.hatena.ne.jp/KishikawaKatsumi/20081014/1223986859
注意点は
・復元したときに参照カウンタを+1しないので、retainしておく。
・復元時にはinitWithCoderが実行される。initは実行されない。initWithCoder内で[super init]はいる。
・インスタンス変数にはシリアライズに対応していないものがある場合は、それをシリアライズ出来るようにしておく。
例えば、
A{
B
C
}
B{
D
E
}
の場合、
Aをシリアライズに対応させるには、BとCもシリアライズに対応しないといけない。
このとき、DとEをシリアライズに対応しないと〜
と芋づる式にどんどんシリアライズのコードを書くことになります。
エンコード時にシリアライズされるインスタンスの参照カウンタはどうなる?というのを疑問に思ったのでやってみました。参照カウンタは+1されます。シリアライズするとき必要になるだけなので参照カウンタは変わらないと予想したのですが、カウントされるようです。エンコードオブジェクトが消される時に-1されるのでしょう。
コメント
コメントを投稿