【问题标题】:initWithCalendarIdentifier no concrete implementation?initWithCalendarIdentifier 没有具体实现?
【发布时间】:2013-09-30 19:39:53
【问题描述】:

将应用升级到iOS7,我有以下代码:

NSCalendar *calendar = [[NSCalendar currentCalendar] initWithCalendarIdentifier:NSGregorianCalendar];

我得到:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“* -[NSCalendar initWithCalendarIdentifier:]:仅为抽象类定义的方法。定义 -[_NSCopyOnWriteCalendarWrapper initWithCalendarIdentifier:]!'

有什么想法吗?谢谢

【问题讨论】:

    标签: objective-c calendar ios7 abstract-class


    【解决方案1】:

    NSCalendar 的 currentCalendar 方法返回一个完全初始化的 NSCalendar 实例,所以你不需要初始化它。你应该这样做:

    NSCalendar *calendar = [NSCalendar currentCalendar];
    

    仅供参考,iOS6 也是如此;从来没有必要对 [NSCalendar currentCalendar] 返回的值调用 init 方法。

    如果你只想创建一个新的公历实例,与 currentCalendar 无关,你可以这样做:

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    

    【讨论】:

    • 谢谢。这些都是有用的建议。我试图了解为什么我在问题中发布的行在 iOS6 中没有运行时错误,但在 iOS7 中却有
    • [NSCalendar currentCalendar] 在 iOS6 中返回一个 __NSCFCalendar 实例,大概实现了 initWithCalendarIdentifier: 方法。在 iOS7 中,它返回一个 _NSCopyOnWriteCalendarWrapper,显然没有。
    • 无论如何,你永远不应该在已经调用了init方法的对象实例上调用init方法。
    • 谢谢。我有 dotNet 的经验,对 ObjC 来说相当新,所以不启动两次对我来说完全有意义。就像背景一样,这是我刚刚开始查看并被要求升级到 iOS7 的以前的开发人员代码。我现在想知道他们进行初始化是否完全错误,或者背后是否有一些微妙的原因。我会让你接受的答案。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多