2012-03-09 7 views
0

私はNSMutableArrayを返してくれました。 追加したオブジェクトにはプロパティ名、年齢があります。NSObjectポインタのプロパティを呼び出すとビルドエラーが発生するのはなぜですか?

今、私は、オブジェクトの上にこれらのプロパティを使用するときには、このようなメンバー、 コンパイラは言う、(obj.nameまたはobj.age)返されない、使用(->)の代わりに、(.

私はNSObjectのは、文句を言わないこれらのメンバーを持っていることを理解し、したがって、それはプロパティを理解していない。

しかし、私はこのプロパティの代わりにメソッド([obj name]または[obj age])の構文でセッターとゲッターを使用すると、エラーは表示されません。

しかし、プロパティを使用するとは、セッターまたはゲッタだけを呼び出すことを意味しますか?
広告Objective Cは動的言語であると思われます。

答えて

1

このような場合は、正しいドットシンタックスはサポートされていません。あなたが実際のクラスへのポインタをキャストする必要が

((MyObject*)[array objectAtIndex: 0]).name = @"Bill"; 
3

は、あなたのオブジェクトタイプ(MyObject)に返されたオブジェクトをキャストしますか?

あなたが何か行う必要があります。

((MyObject*)[mutableArray objectAtIndex:0]).age = 20; 

[[mutableArray objectAtIndex:0] name]構文を使用しているときにエラーを取得していない理由は、あなたが(タイプidである)返されたオブジェクトのメソッドを呼び出しているということです、 idは、(まだ)存在しないメソッドを呼び出すと、コンパイル時にチョークしない傾向があります。実行時に[mutableArray objectAtIndex:0]と入力した場合はMyObjectと入力してください。その場合は、メッセージ[obj name]には適切な実装(IMP)があります。 MyObjectに解決されない場合は、アプリがクラッシュします。

また、コンパイル時の警告さえも得られない理由は、コード・ベースにメソッドnameを実装するクラスが少なくとも1つあることをXcodeが認識しており、このメソッドを呼び出すとあなたを信頼します。そのクラスのインスタンス上の((MyObject*)[mutableArray objectAtIndex:0]).ageeeeee = 20;のようなことをすると、クラッシュする可能性が非常に高いので警告が表示されます(アプリ内のクラスにはメソッドageeeeeeが静的​​に実装されていません)。

タイプidは、プロパティーnameを持たないため、ドット構文を使用できません。

実際、この事件はObjCが動的言語と呼ばれる理由を完全に示しています!

+0

これは問題ありません。ドット構文はsetterメソッドまたはgetterメソッドの呼び出しを表すと仮定しています。それが存在するかどうかにかかわらず、メソッド呼び出しとしては機能しませんか?とにかく ..清算のためにありがとう:) –

+0

プロパティは、読み取り専用になっている場合はどうなりますか?コンパイラがあなたが話しているクラス/プロパティを正確に知っていない限り、(少なくとも値を設定したい場合は)それを使用する必要があるかどうかを知ることはできません。 – UIAdam

+0

@UIAdam:プロパティが読み込み専用であれば、setterは生成されず、実行時に "例外に送信されたセレクタを認識できません"というメッセージが表示されます。 –

関連する問題