1. ホーム
  2. objective-c

[解決済み] Objective-C。 class 指令は @interface の前にあるか?

2023-05-29 09:56:56

質問

この2つのクラス宣言の違いは何でしょうか? なぜここで@classが利用されるのか理解できません。 ありがとうございます。

@class TestClass;

@interface TestClass: UIView {
    UIImage *image1;
    UIImage *image2;
}

@interface TestClass: UIView {
    UIImage *image1;
    UIImage *image2;
}

どのように解決するのですか?

@class は、循環的な依存関係を断ち切るために存在します。 例えば、AクラスとBクラスがあるとします。

@interface A:NSObject
- (B*)calculateMyBNess;
@end

@interface B:NSObject
- (A*)calculateMyANess;
@end

Chicken; meet Egg. AのインターフェイスはBが定義されていることに依存し、逆もまた然りなので、これは決してコンパイルすることができません。

したがって、これを修正するには @class :

@class B;
@interface A:NSObject
- (B*)calculateMyBNess;
@end

@interface B:NSObject
- (A*)calculateMyANess;
@end

@class は、そのようなクラスがどこかに存在し、したがって、そのクラスのインスタンスを指すように宣言されたポインタは完全に有効であることをコンパイラに効果的に伝えます。 しかし、インスタンス参照でメソッドを呼び出すことができず、その型は @class としてしか定義されていないインスタンス参照に対してメソッドを呼び出すことはできません。これはコンパイラが利用できる追加のメタデータがないからです (呼び出し先を id を通しての呼び出しとして評価されるように呼び出しサイトを戻すかどうかは覚えていません)。

あなたの例では @class は無害ですが、まったく不要です。