1

これは一部の人にとってはかなり奇妙に聞こえるかもしれません..しかし、私はこれを続けて尋ねました..明らかに、誰もやりたがりません..しかし、概念をより明確にするために、私は尋ねたい. 通常、次のようにします。

NSString *myString=[[NSString alloc]init];
NSString *myString=[NSString string];

私が理解している限り、それはNSStringクラスのポインターオブジェクトを提供しますが、次のようにするとどうなりますか:

NSString *myString=[[NSMutableString alloc]init];
NSString *myString=[NSMutableString string];

この場合、「string」は実際にはどのようなクラスに属しているのでしょうか? また、可変クラスで初期化したので、NSString クラスのオブジェクトである「myString」に NSMutableString クラスのメッセージを送信できます か?? いずれにせよ、これの背後にある概念が何であるかを知ることができます..また、これは配列、辞書、さらには他の多くのカルスの場合にも当てはまります。

4

2 に答える 2

2

はい。オブジェクトの型は alloc メソッドで使用される型になります。NSMutableString で割り当てた場合、オブジェクトは NSMutableString クラスのメンバーになります。

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

親クラスの型を持つ割り当てられたオブジェクトへのポインタがあるため、コンパイラは NSMutableString のメソッドを認識せず、それらを直接呼び出そうとすると警告が表示されます。

ただし、オブジェクトはまだ NSMutableString クラスのメンバーであり、NSMutableString クラスのメッセージに応答します。

myString を NSString へのポインターとして宣言したとしても、このテストを実行して、私が話していることを確認できます。

BOOL test = [myString isKindOfClass:[NSMutableString class]]; //this will hold true

メソッド呼び出しを明示的に行うためにキャストを実行することもできます。

NSString *myString=[[NSMutableString alloc]init];
[(NSMutableString*)myString someNSMutableStringSpecificMethod];

PS: これは可変/不変オブジェクトだけでなく、すべての特殊化クラスにも当てはまります。

于 2013-07-31T12:34:14.967 に答える
0

2行目で何が起こるかというと、NSMutableStringオブジェクトを取得しますが、参照はNSStringです。参照の公開されたインターフェイスでのみメッセージを呼び出すことができます。したがって、メッセージはNSMutableStringオブジェクトに送信されますが、によって公開されたインターフェイスのみが表示されNSStringます。

ただし、いつでも次のようにキャストできますNSMutableString

[((NSMutableString *)myString) appendString:@"anotherString"] // This works because of the cast

[myString appendString:@"anotherString"] // Compiler complains because it does not find that method in NSString interface.

インターフェイスによって公開されたメッセージを送信しNSMutableStringます。

于 2013-07-31T12:33:54.453 に答える