7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

カテゴリでは +initialize を実装してはいけない

Posted at

結論

カテゴリで +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 も大丈夫だと思ってたら大丈夫じゃなかった...)

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?