ios - 无法在 NSDate 类别的初始化方法中初始化静态日历

标签 ios objective-c nsdate nscalendar

我已经为 NSDate (NSDate+Helpers) 创建了一个 helpers 类别。这是我将在类别实现中使用的日历对象的缓存:

static NSCalendar* currentCalendar = nil;
@implementation NSDate (Helpers)

+(void)initialize{
    currentCalendar = [NSCalendar currentCalendar];
}
@end

问题是我的应用程序不再启动。我只看到黑屏。我想知道我做错了什么。你可以在干净的测试项目上遇到同样的问题。

最佳答案

当您使用类别覆盖现有方法时,您覆盖了原始实现,因此 NSDate 的原始 +initialize 方法永远不会被执行。在这种情况下,看起来它正在该方法中执行某些对其自身内部功能来说是必需的操作,这会破坏您的应用。

即使这不是问题,重写 +initialize 方法也是一个坏主意,而进行任何自定义对象实例化更是一个特别糟糕的主意。

尝试在其他地方初始化日历对象,例如在 applicationDidFinishLaunchingWithOptions: 中,在您的应用程序的委托(delegate)中。

您可以做的另一件事是在您的类别中将日历实现为单例,如下所示:

@implementation NSDate (Helpers)

- (NSCalendar *)myCurrentCalendar {
    static NSCalendar *currentCalendar; // static property
    static dispatch_once_t onceToken;   // token for dispatch
    dispatch_once(&onceToken, ^{
        currentCalendar = [NSCalendar currentCalendar]; // initialise
    });
    return currentCalendar; // return the calendar
}

然后,当您需要使用它时,您可以通过 [NSDate myCurrentCalendar] 访问它。这将在您第一次调用此方法时初始化日历,并且在后续调用此方法时将立即返回日历。

关于ios - 无法在 NSDate 类别的初始化方法中初始化静态日历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24205822/

相关文章:

ios - 无法在 Swift 中的 UIButton 上显示图像

ios - iPad 应用程序在 2 秒后关闭,内存问题?

ios - 为 NSCalendarIdentifier 返回 nil 使用变量属性值

iphone - 如何在 ios 中将特定的 NSDate 转换为 UNIX 时间戳

ios - 为什么当我尝试格式化日期时得到默认日期值?

ios - 如何最好地按时间戳保存聊天中的消息?

ios - 如何停止在 Xcode 中播放不同类的背景音乐?

ios - 如何解析 facebook 喜欢 json 响应?

ios - SWRevealViewController rightViewController 禁用开启

objective-c - 如何判断默认的EKCalendar 'Calendar'是否可以隐藏?