Objective-C/CocoaにおけるNSObjectの役割と意味

C++は、オブジェクトの基本動作を言語が規定する

C++では

  • オブジェクトをnewしたら、メモリ領域が確保されてそのクラスのコンストラクタが継承順に走り、初期化が行なわれて、失敗したらbad_allocをthrowする
  • オブジェクトをdeleteしたら、デストラクタが継承順に実行されてメモリの解放が行なわれる

といった動作は、言語で規定されています。

Objective-Cの場合は、これらの動作は「言語としては」規定されていません。

C++のnew/deleteに相当するalloc/deallocは、Objective-C/CocoaではNSObjectのメソッドになっています。
NSObjectがなければオブジェクトの基本動作が定義されないため、自分で基本動作を定義するクラスを作るか別のフレームワークを使わざるを得ません。逆に言えば、通常すべてのクラスはNSObjectを継承する必要があります。

NSObjectのような、すべてのクラスが行なうべき動作を定義しているクラスをルートクラスと呼ぶらしいのですが、Objective-CがNSObjectをルートクラスにしているわけではなく、CocoaがNSObjectをルートクラスにしている、という言い方が正しいでしょう。

Cocoaでは、参照カウンタを使ったメモリ管理機構がありますが、これもNSObjectの性質であって、Objective-Cが参照カウンタ機能を言語として持っているのではありません。

更新日: