2

私はこのコードを持っています:

@interface Bar : UIView
- (id)initWithInt:(int)i;
@end

@implementation Bar
- (id)initWithInt:(int)i {
  self = [super init];
  return self;
}
@end

void func() {
  [[[Bar alloc] initWithInt:10] doSomething];
}

コンパイラーは func() 関数でエラーを出します: No visible @Interface for Bar は、セレクター doSomething を宣言しません。メソッド doSomething を持つ別の @interface があります。コンパイラはどういうわけか、initWithInt: が id ではなく instancetype を返すと想定していました。これにはどのようなルールがありますか?どのような場合に、コンパイラはメソッドが instancetype を返すと想定しますか?

4

3 に答える 3

4

どのような場合に、コンパイラはメソッドが instancetype を返すと想定しますか?

それは「CLANG LANGUAGE EXTENSIONS」に記載されています:

Cocoa の規則に従って、特定の名前 (「init」、「alloc」など) を持つ Objective-C メソッドは、常に受信クラスの型のインスタンスであるオブジェクトを返します。このようなメソッドは「関連する結果の型」を持つと言われます。つまり、これらのメソッドのいずれかに送信されるメッセージは、受信者クラスのインスタンスと同じ静的型を持つことになります。

...

メソッドが推論された関連する結果の型を持っているかどうかを判断するために、キャメル ケース セレクター (たとえば、「initWithObjects」の「init」) の最初の単語が考慮され、戻り値の型に互換性がある場合、メソッドは関連する結果の型を持ちます。そのクラスの型で、次の場合:

  • 最初の単語は「alloc」または「new」であり、メソッドはクラスメソッドです。
  • または、最初の単語が「autorelease」、「init」、「retain」、または「self」であり、メソッドがインスタンス メソッドです。

したがって、initWithInt:メソッドには「推測された関連する結果の型」があるため、コンパイラは のインスタンスを返すと想定しますBar

于 2013-10-30T13:07:07.270 に答える
0

メソッド doSomething を持つ別の @interface があります。

各クラスには正確に 1 つ@interfaceが必要です (ただし、クラス拡張、カテゴリなどを作成してさらにメソッドを追加することもできます)。-doSomethingメソッドが別のファイルのカテゴリ (またはクラス拡張) にある場合は、その宣言が#import.

于 2013-10-30T12:37:04.177 に答える