5

我正在尝试子类NSArray化,但是在尝试访问 count 方法时它会使应用程序崩溃。我知道那NSArray是一个 类簇

  • 但是,这是什么意思?
  • 是否有解决方法可以将 NSArray 子类化?

我知道我可以简单地子类化NSObject并将我的数组作为实例变量,但我宁愿子类化NSArray

编辑: 原因:我正在创建一个纸牌游戏,我有一个类Deck,它应该子类NSMutableArray化有几个额外的方法(-shuffle、、、-removeObjects:等),我认为子类化而不是 var-renew看起来会更干净。NSArray

4

5 回答 5

17

在这样的类上添加类别的问题是该类的所有实例都将继承其他方法。这既是不必要的(因为不是每个数组都需要能够被洗牌等)而且很危险(因为你不能从类型检查中受益,以确保你当前所指的 NSArray 确实是一个预期被洗牌的数组)。

另一种方法是创建您自己的 Deck 类,该类将 NSMutableArray 作为实例变量。在那里,您可以完全按照您的意愿在您的卡组上定义操作,并且您使用 NSMutableArray 的事实成为实现细节。这使您可以在编译时利用类型检查,并且可以在不更改其客户端的情况下更改 Deck 类的内部实现。例如,如果您出于某种原因决定 NSMutableDictionary 将是更好的后备存储,您可以在 Deck 类的实现中进行所有这些更改,而无需更改任何创建和使用 Deck 的代码。

于 2010-12-04T02:38:33.177 回答
7

您通常不需要对其进行子类化,但无论如何,Apple 提出的建议是:

NSArray 的任何子类都必须覆盖原始实例方法countobjectAtIndex:. 这些方法必须在您为集合元素提供的后备存储上运行。对于这个后备存储,您可以使用静态数组、标准 NSArray 对象或其他一些数据类型或机制。您还可以选择部分或完全覆盖您想要为其提供替代实现的任何其他 NSArray 方法。

你真的覆盖了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 回答