まず、子クラスが次のように定義されていると仮定します。
@interface Gfx : NSObject
(は質問では省略されています。また、 と の両方とNSObject
も呼ばれます) つまり、「子」は「親」のサブクラスではありません。Gfx
myChildClass
メソッドの宣言を与えていないので、次のGfx
init
ように推測します。
- (id) init:(id)parent
現在、プロパティにアクセスするための「ドット」構文は、参照オブジェクトの実際の型ではなく、オブジェクト参照を保持する変数の静的型に依存しています。あなたが持っている場合:
id parent; // instance variable
と
parent.myObject
その場合、コンパイラはid
プロパティを持たないため、反対しますmyObject
。2 つのソリューション:
(a) setter/getter メソッドを直接呼び出します。例:
[parent myObject]; // get the value of the property
[parent setMyObject:e]; // set the value of the property to e
これは、コンパイラがid
特別に処理し、呼び出しに対して静的な型チェックを実行しないため機能します。メソッドは実行時にのみ動的に検出されます。ただし、これによっても問題が発生します。参照されるオブジェクトに/メソッドparent
がない場合はどうなるでしょうか。実行時にエラーが発生します。myObject
setMyObject
parent
(b)正しく入力またはキャストする。タイプするには、インスタンス変数とinit
宣言を useAppDelegate
に変更します。たとえば、次のようになります。
- (id) init:(AppDelegate *)parent
これにより、静的 (コンパイル時) 型チェックとドット表記が得られます。キャストを使用して、そのまま使用することもparent
できid
ます。
((AppDelegate *)parent).myObject; // compiler will be happy
ただし、これはオブジェクトを参照しているparent
かAppDelegate
どうかをチェックしません。キャストは、コンパイラへの「信頼してください」命令です。そのため、キャストを使用すると静的型チェックがバイパスされますが、ランタイム チェックは引き続き実行されます。
HTH