iOSアプリデータの保存

iOSアプリの開発を初めて以来、データを保存する際に考察したこと、改善したことが多々あるので、まとめて記事をQiitaにて書いた。

iOSアプリデータの保存 – Qiita

この状態に至るまで、開発中で出合った諸問題:

  • ストレージのスペースが足りなくてハングする問題。
  • Realmファイルがメモリに乗らない問題。
  • Realmファイルのマイグレーションで失敗して起動できない問題。
  • 使用しない無駄なキャッシュを蓄積してしまう問題。
  • キャッシュが増え続ける問題。

無用の用

松山大耕氏が書籍『ビジネスZEN入門』やサミット等で共有していた内容で印象に残ったこと。

仏教には「無用の用」ということばがある。

「水が一杯入ったコップに更に水を追加することはできない。
コップが空であることによって、水を入れられる。」

心も同じであり、
瞑想、座禅、マインドフルネスで心を空っぽにすることができる。

マインドフルネスはアメリカの大手企業もやっていて、免疫力が上がる効果もあるらしい。
ただし、座禅と比べると目的は異なる。
大手企業はマインドフルネスによるゲインを得ることを目的としているが、座禅はゲインを求めない。
座禅をするために座禅をするだけ。

Swift でシングルトン

単純なシングルトン

class Feature {
    static let instance = Feature()
}
  • 最初のアクセスのときにインスタンスが作られる。
  • スレッドセーフである。

明示的に初期化・開放するシングルトン

class Feature {
    static var instance: Feature {
        return _instance
    }

    static func initializeInstance() {
        _instance = Feature()
    }

    static func finalizeInstance() {
        _instance = nil
    }

    private static var _instance: Feature! = nil
}
  • スレッドセーフではない。でも明示的にインスタンスするならそこは使う側が注意している前提。

その他の考慮

  • init を private にすれば、外部でのインスタンス作成を防げる。でも使う側はそんなバカではないはずだし、仮に間違った使い方をされたら議論したいのでオープンにしておきたい。
  • Objective-C でも使うなら public クラスにして NSObject を派生し、 init を override。