2009-06-04 13 views
13

私はRAIIとシングル対2フェーズの構築/初期化について読んできました。どのような理由であれ、私は最近まで2フェーズキャンプにいました。なぜなら、ある時点では、コンストラクターでエラーが発生しやすい操作を行うのが悪いと聞いてきたに違いないからです。しかし、私は今、私がSOやその他の記事で読んだ質問に基づいて、単相が望ましいと確信していると思います。目的C二相構成のオブジェクト

私の質問は、Objective Cが非便利なコンストラクタにほぼ排他的に2フェーズアプローチ(alloc/init)を使用するのはなぜですか?言語に具体的な理由はありますか、それともデザイナーの意思決定だったのでしょうか?

答えて

28

私は1991年に+allocを書いた男のために働くといううらやましい状況があり、数ヶ月前に彼に非常によく似た質問をしました。 +allocの追加は、メモリが非常にタイト(4M)だったNeXTSTEP 2.0でメモリプールを追加するためのもので、+allocWithZone:を提供するためのものでした。これにより、呼び出し元はオブジェクトがメモリ内のどこに割り当てられたかを制御することができました。これは、+newとその親族の代わりであり、Smalltalkのnewに基づいて、1相のコンストラクタであった(そして誰もそれを使用していないが)。 Appleにココアが来たとき、+allocの使用はすでに確立されていました。実際にNSZoneを選ぶことはめったに重要な価値ではありませんが、+newに戻ることはありませんでした。

したがって、大きな1フェーズ/ 2フェーズの哲学的質問ではありません。実際には、+allocのテストをせずに、1回の呼び出しで常にこれらを連続して呼び出すので、Cocoaは単相構成になっています。あなたはそれを "新しい"とタイプする精巧な方法と考えることができます。

+3

+1うわー、私は良い答えを求めていない可能性があります –

3

私の経験はC++ですが、C++の1段階初期化の欠点は継承/仮想関数の処理です。 C++では、you can't call virtual functions during construction or destruction(まあ、それはあなたが期待していることをすることはできません)。 2段階のinitはこれを解決することができます(部分的には、わかっていることから、適切なクラスにルーティングされますが、initはまだ完了していない可能性があります。 1つの段階)