我为NSDate(NSDate + Helpers)创建了一个帮助程序类别。这是我将在类别实现中使用的日历对象的缓存:
static NSCalendar* currentCalendar = nil;
@implementation NSDate (Helpers)
+(void)initialize{
currentCalendar = [NSCalendar currentCalendar];
}
@end
问题是我的应用程序不再启动了。我只看到黑屏。我想知道我做错了什么。你可以在清洁测试项目上遇到同样的问题。
答案 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]
访问它。这会在第一次调用此方法时初始化日历,并且对该方法的后续调用将立即返回日历。