5

をサブクラス化NSArrayしようとしていますが、count メソッドにアクセスしようとするとアプリがクラッシュします。私はそれNSArrayクラス clusterであることを知っています。

  • しかし、これはどういう意味ですか?
  • NSArray をサブクラス化できるようにするための回避策はありますか?

単純にサブクラスNSObject化して配列をインスタンス変数として持つことができることはわかっていますが、むしろサブクラス化したいと思いますNSArray

編集: 理由: 私はカード ゲームを作成しています。いくつかの追加のメソッド ( 、、など)を持つようにDeckサブクラス化する必要があるクラスがあります。NSMutableArray-shuffle-removeObjects:-renewNSArray

4

5 に答える 5

17

このようなクラスにカテゴリを追加する際の問題は、クラスのすべてのインスタンスが追加のメソッドを継承することです。これは不要であり (すべての配列をシャッフルできる必要があるわけではないなど)、危険です (現在参照している NSArray が実際にシャッフルされると予想されたものであることを確認するために型チェックを行うことはできないため)。 )。

別の方法は、インスタンス変数として NSMutableArray を持つ独自の Deck クラスを作成することです。そこでは、デックで好きなようにアクションを正確に定義でき、NSMutableArray を使用しているという事実が実装の詳細になります。これにより、コンパイル時に型チェックを利用でき、クライアントを変更せずに Deck クラスの内部実装を変更できます。たとえば、何らかの理由で NSMutableDictionary がより適切なバッキング ストアになると判断した場合、Deck を作成および使用するコードを変更することなく、Deck クラスの実装内でこれらすべての変更を行うことができます。

于 2010-12-04T02:38:33.177 に答える
7

通常はサブクラス化する必要はありませんが、Apple からの提案は次のとおりです。

NSArray のすべてのサブクラスは、プリミティブ インスタンス メソッドおよび をオーバーライドする必要があります。これらのメソッドは、コレクションの要素に提供するバッキング ストアで動作する必要があります。このバッキング ストアには、静的配列、標準の NSArray オブジェクト、またはその他のデータ型やメカニズムを使用できます。代替実装を提供したい他の NSArray メソッドを部分的または完全にオーバーライドすることもできます。countobjectAtIndex:

実際にcountメソッドをオーバーライドしましたか? 彼らが言うように、配列要素を保持するために独自のバッキング構造を提供し、これを考慮して提案されたメソッドをオーバーライドする必要があります..

于 2010-12-04T01:38:43.997 に答える
3

新しいメソッドを追加するだけで、既存のバッキング ストアを使用する場合は、NSArray にカテゴリを追加することをお勧めします。カテゴリは、objective-C の非常に強力な部分です。いくつかのサンプルについては、 cocoadevを参照してください。

于 2010-12-04T01:53:55.277 に答える
0

NSMutableArray変更可能な配列プロパティを持つ- (void)removeObjectsInArray:(NSArray *)otherArray; NSObject サブクラスを作成するのが最善です。

于 2010-12-04T04:16:20.343 に答える
-1

この特定のケースでは、 -sortedArrayUsingComparator:を使用して配列をシャッフルし、コンパレーターがランダムにNSOrderedAscendingorを返すようにしますNSOrderedDescending

例えば:

NSArray *originalArray; // wherever you might get this.
NSArray *shuffledArray = [orginalArray sortedArrayUsingComparator:
    ^(id obj1, id obj2) { 
     return random() %  2 ? NSOrderedAscending : NSOrderedDescending;
     }];
于 2010-12-04T04:08:40.030 に答える