2012-03-17 11 views
0

私はObjective Cの新機能ですが、とにかくuberプログラマではありませんが、奇妙な点は、オブジェクトが初期化されていないと宣言されたときにエラーをスローしないことです。目的Cは十分なエラーを投げていませんか?

私はinitの機能に入れられるようにいくつかの設定をしましたが、このクラスはストーリーボードに組み込まれたUIViewControllerです。だからinitは決して呼び出されませんでした - それは私のエラーです - (多くのNSObjectプロジェクトの派生クラスと私は急いで、いくつかのことをテストするために投げただけです)。

しかし、intに設定されているはずのインスタンスを呼び出すメソッドでエラーが発生しませんでした。これは、私が期待していた値がnilであったということだけです。

そんなものが黙って失敗するのは奇妙なことではありませんか?

答えて

5

ここでは2つの別々の問題があります。どちらも初心者にとってはよくあることです。

  1. initは完全に間違った方法であるため、決して呼び出されませんでした。いずれの場合も、ペンまたはストーリーボードのビューコントローラはinitWithCoder:を取得します。だから、どのメソッドが呼び出されるか、そしていつ呼び出されるかはあなた次第です。

  2. メッセージはnilにエラーなしで返されます。これはObjective-Cの深い根底にある機能であり、変更されることはありません。それについての準宗教的な議論がしばしばあり、その周りにいくつかの巧妙な方法がありますが、それは本当にここにもそこにもありません。基本的には、NSLogの多くを使用し、多くのゼロ点検(NSAssertはこれに使用するのに最適です)まで、特に初期段階ではあなた次第です。

+0

自己宣伝の警告:私の新しい本http://shop.oreilly.com/product/0636920023562.doは、これらのことについてあなたに警告していたでしょう。私自身の経験から生まれた、本当の学習者に起こる嫌なことについての注意がいっぱいです。 – matt

+0

私は 'init'を呼び出す際にエラーが発生したことを知っています - 私は間違ったことを除いて、私が作った間違いの性質を理解しています。私はコンパイラがさまざまなエラーについてあまりにも多くのことを言ってくれると思うので、私は、言語が私が考えることができるほとんどの状況で重大なエラーになるようなものを私に渡すとは期待していませんでした。 –

+0

さて、あなたは知っています。 「なぜObjective-Cはメッセージを許可しないのですか?」というのはトップのFAQなので、Google検索を行う方が良いです。ここでは、ほとんどの高い点に当てはまるかなり良い議論があります:http:// stackoverflow。com/questions/156395/sending-a-message-to-nil – matt

1

全く奇妙ではありません。 That's how Objective-C has always worked.メッセージは単に何もしません。

+0

ありがとうございました。私はmsgsを 'nil'に送ることについて読んだことを思い出して、実際にそれをしたいと思う実際の世界の事例を本当に感謝しませんでした。例外がスローされた場合にコーディングエラーをキャッチするのに適していませんか?私はそれに対する答えはないと思う - しかし、なぜ私は理解していない。 –

0

これはObj-Cの設計方法です。実際、Obj-Cの観点からは、コードは失敗しませんでした(サイレント)。すべて正しいものでした。

Obj-Cでは、メッセージを(「メソッドを呼び出す」)nilに送信することもできます。

initは、別のメッセージ(「メソッド」)であり、コンストラクタではありません。オブジェクトを作成して使用する必要はありません。 Obj-CはC言語よりも薄い層としてしか理解できません。構造体に関数を呼び出さなかった場合、C言語は報告しません。

関連する問題