実際、私は Java のバックグラウンドを持っており、Objective C を学習しています。Objective C の奇妙な動作について非常に混乱しています。
質問は順番に提供されますので、私や他の人が理解できるように順番に答えてください。
質問 1 :と:
から派生した 2 つのクラスがあります。NSObject
A
B
@interface A : NSObject
@end
@interface B : NSobject
-(void)display; // It displays "I am class B"
@end
今私がこれを行うと:
A *a = [[B alloc]init]; // Show warning not error (it must be illegal)
[a display]; // prints "I am class B"
クラス B の表示メソッドを呼び出します。
A
メソッドがありませんdisplay
。ポリモーフィズムによる。これは、任意のクラスの参照を作成し、別のクラスのオブジェクトを渡し、それによってデータにアクセスしているため、セキュリティ上の脅威になる可能性があります。
Dog
クラス インスタンスがクラスのオブジェクトを取得し、インスタンスでメソッドをPrinter
呼び出しているため、設計上の問題が発生する可能性があります。print
Dog
の参照
NSArray
と渡されたオブジェクトがあり、現在、このインスタンスでメソッドをNSMutableArray
呼び出しています。NSMutableArray
[nsarri addObject:@:abc]; //非常に奇妙に見える
質問 2
プロトコル
がFoo
あり、それを確認していないクラスはありますか。プロトコル参照でそのクラスのオブジェクトを取得することは許可されるべきではありません。
@protocol Foo
@required
-(void)abc;
@end
私が電話した場合:
id<Foo> obj= [[B alloc]init]; // Shows warning ignore it for now as it must be illegal also
[obj display]; // It will call display method which should be illegal
- プロトコルに
B
準拠しておらず、オブジェクトを取得してインスタンスメソッドを呼び出しているため、発生しないはずです。ポリモーフィズムとセキュリティのために非常に悪いと思いますFoo
obj
B
B
質問 3
クラスに、自動解放されていないそのクラスのオブジェクトを返すクラス メソッドがある場合、コンパイラは警告を表示します。そのクラス(プロトコルに準拠していない)メソッドから返されたオブジェクトをプロトコルの参照に渡すと。(それはエラーであるべきです)。
id<Foo> obj = [Abc aClassMethodReturnsObjectWhichNotAutoreleased]; //show warning
それは良い警告を示しています。 Abc
プロトコルに準拠していませんでしたFoo
しかし
id<Foo> obj = [NSArray arrayWithObjects:@"abc",@"def",nil]; // It does **not** show a warning as it will return autorelease object. NSArray doesn't conform protocol Foo
NSArray
前の例に示されているように、クラス への上記の割り当てで警告が表示されないのはなぜですか。
前もって感謝します。
編集
* 3 番目の質問への回答: *NSArray は "id obj" を渡すことを許可する id オブジェクトを返しますが、"aClassMethodReturnsObjectWhichNotAutoreleased" の場合、メソッドは "ABC *" ポインターを返すため、この場合コンパイラは警告を出します。