不能继承NSNumber,NSNull,......,为什么?

时间:2012-12-14 13:15:30

标签: iphone objective-c ios

对iOS应用程序进行编码,我发现有可能禁止继承NSNumber,NSNull,... blabla。

如果我尝试这样做,编译器不会失败,但运行会在没有任何使用信息的情况下立即崩溃,是否有人知道原因?

2 个答案:

答案 0 :(得分:4)

Subclassing Notes

  

与任何类集群一样,如果您创建NSNumber的子类,则为   必须覆盖其超类NSValue的原始方法。   此外,还有一组受限制的返回值   执行NSValue方法objCType可以返回,以便   利用非原始的抽象实现   方法。有效的返回值是“c”,“C”,“s”,“S”,“i”,“I”,   “l”,“L”,“q”,“Q”,“f”和“d”。

更准确地说,我相信这是因为你从未真正拥有过NSNumber的实例。 Objective-C有一个有趣的特性,即类的初始化器实际上可以改变自身指向的对象(这可能实际上对任何方法都是正确的,但我只听说它在init方法中使用)。我相信NSNumber就是这么做的。

另请参阅Class Clusters上的文档。

答案 1 :(得分:2)

嗯......来自NSNumber Class Reference,只要你适当地继承了NSValue,它看起来就像允许子类化一样。

  

子类注释

     

与任何类集群一样,如果创建NSNumber的子类,则必须覆盖其超类NSValue的基本方法。此外,为了利用非原始方法的抽象实现,NSValue方法objCType的实现可以返回一组有限的返回值。有效返回值为“c”,“C”,“s”,“S”,“i”,“I”,“l”,“L”,“q”,“Q”,“f”和“d”。


我在NSValue中没有看到任何子类注释,但我猜你需要在NSValue中实现每个方法。