目标C-子分类nsarray
-
08-10-2019 - |
题
我正在尝试子类 NSArray
, ,但是当尝试访问计数方法时,它会崩溃。我知道 NSArray
是一个 类集群.
- 但是,这是什么意思?
- 是否有能够为NSArray子级的工作吗?
我知道我可以简单地子类 NSObject
并将我的数组作为实例变量,但我宁愿子类 NSArray
.
编辑:原因:我正在创建纸牌游戏,我有一个课程 Deck
应该子类 NSMutableArray
要有几种额外的方法(-shuffle
, -removeObjects:
, -renew
, 等),我认为它看起来更干净 NSArray
而不是有var。
解决方案
在这样的类上添加类别的问题是,类的所有实例都将继承其他方法。这都是不必要的(因为并非每个阵列都需要被洗牌等)和危险(因为您无法从Typechecking中受益,以确保您目前所指的NSArray确实是预期会被淘汰的)。
一种替代方法是创建自己的甲板类,该类别将NSMutableArray作为实例变量。在这里,您可以按照自己的意愿在甲板上定义操作,并且您使用的是NSMutableArray成为实现细节的事实。这使您可以在编译时使用TypeChecking,并且可以在不更改其客户端的情况下更改甲板类的内部实现。例如,如果您由于某种原因决定NSMutableDictionary将是一个更好的备份商店,则可以在甲板类实现中进行所有这些更改,而无需更改创建和使用甲板的任何代码。
其他提示
您通常不需要子类,但是无论如何,苹果提出的建议是:
NSArray的任何子类 必须 覆盖原始实例方法
count
和objectAtIndex:
. 。这些方法必须在您为集合的元素提供的备用存储店中运行。对于此备份存储,您可以使用静态数组,标准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;
}];