我正在尝试子类 NSArray, ,但是当尝试访问计数方法时,它会崩溃。我知道 NSArray 是一个 类集群.

  • 但是,这是什么意思?
  • 是否有能够为NSArray子级的工作吗?

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

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

有帮助吗?

解决方案

在这样的类上添加类别的问题是,类的所有实例都将继承其他方法。这都是不必要的(因为并非每个阵列都需要被洗牌等)和危险(因为您无法从Typechecking中受益,以确保您目前所指的NSArray确实是预期会被淘汰的)。

一种替代方法是创建自己的甲板类,该类别将NSMutableArray作为实例变量。在这里,您可以按照自己的意愿在甲板上定义操作,并且您使用的是NSMutableArray成为实现细节的事实。这使您可以在编译时使用TypeChecking,并且可以在不更改其客户端的情况下更改甲板类的内部实现。例如,如果您由于某种原因决定NSMutableDictionary将是一个更好的备份商店,则可以在甲板类实现中进行所有这些更改,而无需更改创建和使用甲板的任何代码。

其他提示

您通常不需要子类,但是无论如何,苹果提出的建议是:

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

你实际上覆盖了吗 count方法?正如他们所说,您必须提供自己的背支持结构以保存数组元素,并考虑到这一点的建议方法。

如果您只是添加新方法,并使用现有的备份商店,那么更好的方法是将类别添加到NSArray。类别是Objective -C的真正强大一部分 - 请参阅 Cocoadev 对于一些样本。

NSMutableArray 已经有一个 - (void)removeObjectsInArray:(NSArray *)otherArray;您将最好使用具有可变阵列属性的NSOBJECT子类。

在这种特殊情况下,我会使用 -sortedArrayUsingComparator: 并使您的比较器随机返回 NSOrderedAscending 或者 NSOrderedDescending.

例如:

NSArray *originalArray; // wherever you might get this.
NSArray *shuffledArray = [orginalArray sortedArrayUsingComparator:
    ^(id obj1, id obj2) { 
     return random() %  2 ? NSOrderedAscending : NSOrderedDescending;
     }];
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top