【发布时间】:2019-05-15 11:57:47
【问题描述】:
我想使用 NSLog 一个 NSDate 对象,并在自定义的日期格式化程序中显示它,例如“yyyy-MM-dd”。所以我在 NSDate 的类别文件中覆盖了实例的方法“-(NSString*)description”。但它不起作用。 谁能告诉我如何实现这个?
在 Objective-c 中。
@interface NSDate(Test)
@end
@implemetion NSDate(Test)
- (NSString *)description
{
return @"test";
}
@end
// in the code that will actually run.
{
NSDate *date = [NSDate date];
NSLog(@"%@", date);
}
// but it's not print "test" at last. why?
我希望它运行我在类别中覆盖的代码。
【问题讨论】:
-
如果某个类别中声明的方法名称与原类中的方法名称相同,或者同一类(甚至超类)上的另一个类别中的方法名称相同,则行为未定义至于在运行时使用哪种方法实现。如果您在自己的类中使用类别,这不太可能成为问题,但在使用类别向标准 Cocoa 或 Cocoa Touch 类添加方法时可能会导致问题。
-
不要覆盖类别中的方法,而是创建子类或使用其他名称创建方法
-
虽然类别中的方法会覆盖主类中的方法,但不要这样做 :-) 真正的答案是 NSDate 是一个抽象超类,并且运行时的实例通常会是一个私有子类,并且该私有子类本身会覆盖 -description 所以你的方法不会被调用。
标签: objective-c nsdate objective-c-category