我第一次尝试subClassed NSDate给它2个我需要的方法。编译很好,但在运行时我尝试访问它我得到一个错误。
假设我只想要在子类中未修改的当前日期:
[myNSDate date];
我收到错误
-[NSDate initWithTimeIntervalSinceReferenceDate:]: method only defined for
abstract class. Define -[myNSDate initWithTimeIntervalSinceReferenceDate:]!
有什么不同?
答案 0 :(得分:7)
NSD的答案核心,我只想简单地重申一下。 NSDate
不是一个你可以轻松子类化的简单类。它是class cluster,简而言之,当您获得类型NSDate
的值时,它实际上是与NSDate
具有相同接口的不同私有类的实例。换句话说,NSDate
不是你想要的子类。
如果您只想添加方法(而不是实例变量),可以使用类别轻松完成:
@interface NSDate (MyExtensions)
- (void) doFoo;
@end
@implementation NSDate (MyExtensions)
- (void) doFoo {
NSLog(@"Foo");
}
@end
现在您可以致电[date doFoo]
。另见Mike Ash的class cluster subclassing tutorial。
答案 1 :(得分:1)
NSDate是一个类集群,您不应该对其方法返回的基础类型做任何假设,也不应该尝试对其进行子类化,除非您确切知道自己在做什么。如果要扩展它,请使用类别。