4

さて、これは非常にばかげた初心者の質問かもしれませんが:

ClassAがあります。これは、ClassBから子オブジェクトを作成し、それをインスタンス変数に割り当てます。詳細:ClassAは、指定された初期化子でClassBを割り当てて初期化し、それをchildObjectインスタンス変数に割り当てます。ヘッダーは次のようになります。

#import <Foundation/Foundation.h>
#import "ClassB.h"

@interface ClassA : NSObject {
    ClassB *childObject;
}

@end

次に、ClassBのヘッダーがあります。ClassBにはClassAへの参照が必要です。

#import <Foundation/Foundation.h>
#import "ClassA.h"

@interface ClassB : NSObject {
    ClassA *parentObject;
}

- (id)initWithClassA:(ClassA*)newParentObject;

@end

ClassAオブジェクトがClassBから子オブジェクトを作成すると、ClassAオブジェクトはClassBオブジェクトの指定された初期化子を呼び出し、そこで自分自身(自分自身)を渡す必要があります。

何かがおかしいと感じますが、今のところ正確にはわかりません。私が知っていると思うのは、これは機能しないということです。彼らはお互いを輸入することはできません。コンパイラは、「エラー:「ClassA」の前の構文エラー」とだけ言っています。ClassAをインポートするためのimportステートメントを削除し、ClassA * parentObjectインスタンス変数を削除し、(ClassA参照を取得する)指定イニシャライザーを削除すると、機能します。

さて、これが私が達成したいことです(これが重要な場合):UIScrollViewでいくつかの非常に特別で複雑な動作が必要です。そこで、サブクラス化することにしました。主要部分はデリゲートメソッド内で行われるため、UIScrollViewのサブクラス用に「ジェネリック」デリゲートオブジェクトを作成することにしました。次に、UIScrollViewサブクラスは、その特別なデリゲートオブジェクトを自動的に作成し、それをそのデリゲートプロパティに割り当てます。デリゲートオブジェクト自体は、その親であるカスタマイズされたUIScrollViewへの参照を必要とします。これにより、そのスクロールビューのサブビューにアクセスできるようになります。しかし、とにかく、この問題を解決するためのより良い方法があるとしても、相互に必要な2つの「相互依存」オブジェクトを使用してその方法でそれを実行する方法を知りたいと思います。

どんな提案でも大歓迎です!

4

3 に答える 3

15

これらのクラスをヘッダー ファイルにインポートする必要はありません。ヘッダー ファイルで使用@classし、.m ファイルでのみ #import を使用します。

// ClassA.h:
@class ClassB;
@interface ClassA : NSObject
{
    ClassB *childObject;
}
@end


// ClassA.m:
#import "ClassA.h"
#import "ClassB.h"
@implementation ClassA
//..
@end


// ClassB.h
@class ClassA;
@interface ClassB : NSObject
{
    ClassA *parentObject;
}
- (id)initWithClassA:(ClassA*)newParentObject;
@end


// ClassB.m:
#import "ClassB.h"
#import "ClassA.h"
@implementation ClassB
//..
@end
于 2009-05-07T14:33:21.100 に答える
5

s の代わりに@class A;andを使用して、コンパイラにクラス定義を気にしないように指示し、後でそれらに遭遇するためそのまま続行します。@class B;#import

#import "A.h"と交換するのが基本@class A;です。

于 2009-05-07T14:32:03.773 に答える
5

必要なことは、完全な定義をインポートする代わりに、クラスを「前方宣言」することです。例えば:

#import <Foundation/Foundation.h>

@class ClassB; // Tell the compiler that ClassB exists

@interface ClassA : NSObject {
    ClassB *childObject;
}

@end

そして、ClassB ヘッダー ファイルに対して同様のことを行います。

于 2009-05-07T14:34:31.740 に答える