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

时间:2014-06-13 12:53:13

标签: ios objective-c nsdate nscalendar

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

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

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

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

1 个答案:

答案 0 :(得分:2)

当您使用类别覆盖现有方法时,会覆盖原始实现,因此永远不会执行NSDate的原始+initialize方法。在这种情况下,看起来它正在使用该方法执行某些必要的内部功能,这会打破您的应用。

即使这不是问题,覆盖+initialize方法也是一个坏主意,并且进行任何自定义对象实例化都有一个特别糟糕的主意。

尝试在其他位置初始化日历对象,例如在应用代表的applicationDidFinishLaunchingWithOptions:中。

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

@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]访问它。这会在第一次调用此方法时初始化日历,并且对该方法的后续调用将立即返回日历。