次のようにすると、コンパイラは文句を言いません。
id foo;
[foo retain];
ただし、次のようにすると、コンパイラは文句を言います。
id<NSCopying> bar;
[bar retain];
具体的には、次のように述べています。
Instance method '-retain' not found (return type defaults to 'id')
どうしてこれなの?id
は一般的な Objective-C オブジェクトを指しており、retain
任意の Objective-C オブジェクトに渡すことができると考えました。
これは警告であり、エラーではないことに注意してください。そのため、コードをコンパイルでき、動作しているように見えます。また、警告を抑制するために次のことができることにも気付きました。
[(id)bar retain];
id<NSCopying>
しかし、 は のサブタイプだと思うid
ので、 で実行できることは...id
で実行できます。id <NSCopying>