3

Objective-C では、スーパークラスのコンストラクターを使用して初期化できるのに、スーパークラスを持つalloc+initまたは基本クラス オブジェクトを使用できないのはなぜですか?new

以下はいくつかのコードです:

s1かなり快適に作成できます。

NSMutableString *s1=[NSString string];
NSLog(@"%@",s1);

しかしs2、それs3はできません、そして警告を出します

Incompatible pointer types initializing 'SubClass *__strong' with an expression of type'BaseClass *'

NSMutableString *s2=[[NSString alloc] init];
NSLog(@"%@",s2);

NSMutableString *s3=[NSString new];
NSLog(@"%@",s3);

//here no warning.
id mem=[NSString alloc];
NSMutableString *s4=[mem init];
NSLog(@"%@",s4);

alloc + init を 2 つの異なるステートメントに分割するとどうなりますか?

4

2 に答える 2

4

答えは、Clang3.3ドキュメントのObjective-C機能にあります。

関連する結果タイプ

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

したがって、

NSMutableString *s2 = [[NSString alloc] init];

右側のタイプは実際にはそうNSString *ではなくid、に割り当てるとNSMutableString *「互換性のないポインタタイプ」の警告が表示されます。

一方string

NSMutableString *s1 = [NSString string];

「関連する結果タイプ」がないため、idに割り当てることができるを返すだけNSMutableString *です。

alloc / initを個別のステートメントに分割するidと、中間タイプとして使用する場合にのみ警告が抑制されます。NSStringまたは、NSMutableStringそれでも警告が表示されます。

NSString *tmp4 = [NSString alloc];
NSMutableString *s4 = [tmp4 init]; // <-- Warning here

NSMutableString *tmp5 = [NSString alloc]; // <-- Warning here
NSMutableString *s5 = [tmp5 init];

ドキュメントによると、メソッドの戻り型がそのクラスの型と互換性がある場合、および次の場合、メソッドには「関連する結果型」があります。

  • 最初の単語は「alloc」または「new」であり、メソッドはクラスメソッド、または
  • 最初の単語は「autorelease」、「init」、「retain」、または「self」であり、メソッドはインスタンスメソッドです。
于 2013-03-06T15:04:22.033 に答える
0

最初のケース

   NSMutableString *s2=[[NSString alloc] init];
   NSLog(@"%@",s2);  

ここでは、NSStringインスタンスを作成しinitてメッセージを送信し、最後にNSStringインスタンスを に割り当てていますNSMutableString。ここでコンパイラは、互換性のないポインタ型を割り当てていることを認識しています。だからそれはあなたに警告します。

2 番目のケース

id mem=[NSString alloc];
NSMutableString *s3=[mem init];  

インスタンスを作成し、NSStringtype として割り当てていますidinitタイプのオブジェクトを送信しますidid型はジェネリックです。コンパイラは実行時まで実際の型を知りません (動的型付け)。したがって、警告は表示されません。したがって、問題はネストされた呼び出しにはありません。

最後に、私の観察のみ:)。

于 2013-03-06T14:32:49.230 に答える