結論
カテゴリで +initialize が実装されていると、元の実装が上書きされてしまうため、本来の初期化処理が行われなくなってしまう。
リファレンスにも注意書きがあった。(ref: NSObject Class Reference)
Special Considerations
initialize is invoked only once per class. If you want to perform independent initialization for the class and for categories of the class, you should implement load methods.
対策
+load はカテゴリ毎に実装可能なので、+initialize の代わりにこっちを使用する。
ただし、+load が呼ばれた時点では他のクラスの +load が実行されていない (== 初期化が完了していない) 可能性があるので、スーパークラス以外のクラスの利用は注意が必要。
経緯
なぜだかメモリ不足時に -[UIViewController didReceiveMemoryWarning]
が呼ばれず、原因を調べたら UIViewController のカテゴリで +initialize を実装していたのが問題だった。(iOS 7.1 で確認)
(+load はカテゴリでも使えるから +initialize も大丈夫だと思ってたら大丈夫じゃなかった...)