我正在尝试子类NSArray
,但在尝试访问count方法时崩溃了应用程序。我知道NSArray
是类群集。
我知道我可以简单地将NSObject
子类化,并将我的数组作为实例变量,但我宁愿继承NSArray
。
修改
原因:
我正在创建一个纸牌游戏,我有一个类Deck
,它应该将NSMutableArray
子类化为一些额外的方法(-shuffle
,-removeObjects:
,-renew
,等),我认为子类NSArray
看起来更干净,而不是有一个var。
答案 0 :(得分:17)
在类这样的类上添加类别的问题是该类的所有实例都将继承其他方法。这既不必要(因为不是每个阵列都需要能够被洗牌等)而且很危险(因为你不能从类型检查中受益,以确保你当前所指的NSArray确实是一个预计会被洗牌的人)。
另一种方法是创建自己的Deck类,它具有NSMutableArray作为实例变量。在那里,您可以完全按照自己的意愿在甲板上定义操作,并且您使用NSMutableArray的事实将成为实现细节。这使您可以在编译时利用类型检查,它允许您在不更改其客户端的情况下更改Deck类的内部实现。例如,如果您出于某种原因决定NSMutableDictionary将是更好的后备存储,您可以在Deck类的实现中进行所有这些更改,而无需更改任何创建和使用Deck的代码。
答案 1 :(得分:7)
您通常不需要将其子类化,但无论如何,Apple提出的建议是:
NSArray 的任何子类必须覆盖原始实例方法
count
和objectAtIndex:
。这些方法必须在您为集合元素提供的后备存储上运行。对于此后备存储,您可以使用静态数组,标准NSArray对象或某些其他数据类型或机制。您也可以选择部分或完全覆盖要为其提供替代实现的任何其他NSArray方法。
您是否真的覆盖了count
方法?正如他们所说,你必须提供自己的支持结构来保存数组元素,并考虑到这一点覆盖建议的方法。
答案 2 :(得分:3)
如果您只是添加新方法并使用现有的后备存储,那么更好的方法是向NSArray添加类别。类别是Objective-C的一个非常强大的部分 - 对于某些样本,请参阅cocoadev。
答案 3 :(得分:0)
NSMutableArray
已有- (void)removeObjectsInArray:(NSArray *)otherArray;
你最好用一个可变数组属性创建一个NSObject子类。
答案 4 :(得分:-1)
在这种特殊情况下,我会使用 - sortedArrayUsingComparator:
对数组进行随机播放,并使比较器随机返回NSOrderedAscending
或NSOrderedDescending
。
E.G:
NSArray *originalArray; // wherever you might get this.
NSArray *shuffledArray = [orginalArray sortedArrayUsingComparator:
^(id obj1, id obj2) {
return random() % 2 ? NSOrderedAscending : NSOrderedDescending;
}];