0

クラス「ABC」と、そのクラスの非自動解放オブジェクトを返すそのメソッドがあります。

@interface ABC:NSObject
+(ABC *)aClassMethodReturnsObjectWhichNotAutoreleased;
@end  

@implementation ABC
+(ABC *)aClassMethodReturnsObjectWhichNotAutoreleased{
   ABC *a = [[ABC alloc]init];
   return a;
}
@end

プロトコル Foo がある場合。

@Protocol Foo
@required
-(void)abc;
@end

私の ABC クラスは、Foo プロトコルを「確認していません」。

最初の呼び出し

id<Foo> obj = [ABC aClassMethodReturnsObjectWhichNotAutoreleased]; //show warning

「互換性のないポインター..」という警告が表示されます.AbcはプロトコルFooを確認しませんでした

しかし、2回目の呼び出し

id<Foo> obj = [NSArray arrayWithObjects:@"abc",@"def",nil]; // It will "not" show warning as it will return autorelease object.NSArray don't confirm protocol Foo

最初の呼び出しコンパイラでは警告が表示され、2 回目の呼び出しではコンパイラは警告を表示しません。これは、autorelease オブジェクトを返していないためだと思います。

NSArray も FOO を確認していないため、コンパイラが 2 回目の呼び出しで警告を出さないのはなぜですか?

4

1 に答える 1

0

最初の例では、戻り値は特定の型であるため、コンパイラは割り当てを検証できます。

2 番目の例では、NSArray arrayWithObjects:メソッドの戻り値の型はidです。タイプのオブジェクトをid任意のタイプの変数に割り当てることができます。コンパイラには、実行していることが本当に正しいかどうかを確認する方法がありません。

この問題は、自動解放されたオブジェクトとは関係ありません。それはすべてデータ型に関するものです。id何でもありのキャッチオールタイプです。

于 2012-11-10T16:12:52.870 に答える