2

これは私のコードです

 NSMutableArray * reversedNamesArray; //theres about a thousand variable already stored in here, this is just for documentation
reversedNamesArray = [reversedNamesArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

//Incompatible pointer type assigning "NSMutableArray" to "NSArray"

上記のメッセージは私が得たものであり、それが何を意味するかはわかっていますが、千の変数の NSMutableArray を NSArray にコピーするという余分な手順を実行したくありません。警告を修正するために使用できるキャストはありますか?私のコードには影響しませんが、修正が必要です。互換性がない理由を説明できますか? NSMutableArray と NSArray は同じ量のバイトを使用する必要があるため、そもそも互換性がない理由がわかりません。

4

2 に答える 2

5

@GerdKの答えは正しいものですが、にキャストできない理由を説明すると思いNSArrayましたNSMutableArray。可能であれば、主要な最適化が失われます。次の点を考慮してください。

NSArray *first = @[...];
NSArray *second = [first copy];

これは非常に安いです。にエクストラをsecond追加するだけで完了です。一方で:retainfirst

NSMutableArray *first = [NSMutableArray arrayWith…]
NSArray *second = [first copy];

これはより高価です。を作成するsecondには、実際には新しい配列を作成し、ポインターをコピーして保持を追加する必要があります。

ここで、あなたが要求しているものが合法であると想像してください:

// Not legal, but let's say it were
NSArray *first = @[...];
NSMutableArray *second = (NSMutableArray *)[first copy];

[NSArray copy]、これに対して防御する必要があります。copy完全な (高価な) コピーとして実装する必要があります。それは本当のパフォーマンスの損失です。

copy「でも、本当にコピーしたいときと残しておきたいときだけ使います」と言うかもしれませんretain。確かに、しかしそれだけでは十分ではありません。渡されたものの不変のコピーを保存したいとします。

- (void)setSomething:(NSArray *)array {
   _something = [array copy];
}

これは非常に効率的で正しいセッターです。実数を渡すと、NSArray安価になります (これはおそらく通常のケースです)。を渡すとNSMutableArray(これはサブクラスなので、それを行うことができます)、自動的に実際のコピーを作成します (そのため、オブジェクトは背後で変更できません)。可変オブジェクトと不変オブジェクトを分離することで、この種の最適化を無料で実現できます。そうでなければ、オブジェクトを調べて可変かどうかを尋ね、それに基づいて決定を下す必要があります。

于 2013-10-29T15:02:05.703 に答える