【问题标题】:Why it doesn't work that override the method '-(NString* )description' of NSDate?为什么覆盖 NSDate 的方法 '-(NString* )description' 不起作用?
【发布时间】: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


【解决方案1】:

NSDate 已经有一个名为 description 的字段

您不能通过类别/扩展来覆盖。使用子类 OR 方法 swizzling 或使用不同的字段名称以避免冲突。

【讨论】:

    猜你喜欢
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多