0

メインの AppDelegate クラス (iOS ではなく MacOS 開発) があり、子クラスを開始します

myChildClassObject=[[myChildClass alloc]init:self];

したがって、親参照を子クラスに送信します。ただし、子クラスから親クラスのオブジェクトにアクセスするにはどうすればよいですか? で試しました

parent.myObject

しかし、それは見つかりません。

私の親クラスは次のように定義されています。

@interface AppDelegate : NSObject <NSApplicationDelegate>
{
    NSView *myObject;
}

@property (nonatomic, readwrite, retain) NSView *myObject;
@end

私の子クラスは次のように定義されています。

@interface Gfx
{
}

ありがとう。

4

2 に答える 2

1

まず、子クラスが次のように定義されていると仮定します。

@interface Gfx : NSObject

(は質問では省略されています。また、 と の両方とNSObjectも呼ばれます) つまり、「子」は「親」のサブクラスではありません。GfxmyChildClass

メソッドの宣言を与えていないので、次の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がない場合はどうなるでしょうか。実行時にエラーが発生します。myObjectsetMyObject

parent(b)正しく入力またはキャストする。タイプするには、インスタンス変数とinit宣言を useAppDelegateに変更します。たとえば、次のようになります。

- (id) init:(AppDelegate *)parent

これにより、静的 (コンパイル時) 型チェックとドット表記が得られます。キャストを使用して、そのまま使用することもparentできidます。

((AppDelegate *)parent).myObject; // compiler will be happy

ただし、これはオブジェクトを参照しているparent AppDelegateどうかをチェックしません。キャストは、コンパイラへの「信頼してください」命令です。そのため、キャストを使用すると静的型チェックがバイパスされますが、ランタイム チェックは引き続き実行されます。

HTH

于 2013-09-09T23:25:11.863 に答える
1

ここにはいくつかのことがあります:

1) 次の行を介して、アプリケーションのデリゲートへの参照を簡単に取得できます。

AppDelegate * appDelegate = [[NSApplication sharedApplication] delegate];

2) 親への参照を子に保存する場合は、次のようにします。

次のようなプロパティを子の .h @interface ファイルに追加します。

@property (retain) id parent;

次に、親クラスで、子オブジェクトをインスタンス化した直後に、次のことができます。

ChildObject * child = [[ChildObject alloc] init];
child.parent = self;

また、次の方法で子クラスから親クラスを参照できます。

self.parent;
于 2013-09-09T20:47:34.047 に答える