gpt4 book ai didi

objective-c - 共享 NSDateFormatter - 最佳实践?

转载 作者:太空狗 更新时间:2023-10-30 03:29:06 25 4
gpt4 key购买 nike

我的团队发现我们在整个代码库中使用了各种 NSDateFormatter 对象,并开始研究如何避免在一堆单独的代码中分配/初始化通用格式化程序的成本/困惑地点。

我们的一个想法是在 NSDateFormatter 类上创建一个类别,该类别将提供对常用配置格式化程序的静态实例的引用。例如,我们在几个地方使用了“短时间”日期格式化程序,并希望添加以下类方法:

@implementation NSDateFormatter (NSDateFormatter_PDDateFormatters)

static NSDateFormatter * shortTimeFormatter = nil;

+ (NSDateFormatter *) PDSharedShortTimeFormatter {

@synchronized([NSDateFormatter class]){

if( shortTimeFormatter == nil){

// Create new formatter for SHORT times (e.g. 12:00 pm)

shortTimeFormatter = [[NSDateFormatter alloc] init];
[shortTimeFormatter setDateStyle: NSDateFormatterNoStyle];
[shortTimeFormatter setTimeStyle:NSDateFormatterShortStyle];
}

return shortTimeFormatter;

}

return nil;
}

@end

我对这种方法的一个问题是我们目前没有“保护”NSDateFormatter 不被更改。由于格式化程序在我们的整个应用程序中基本上是“共享”的,如果另一个对象要更改格式化程序的配置(例如时间/日期样式),这可能会导致问题。

因为我们在内部使用它,所以我并不过分担心我们的团队滥用此功能的风险(即它是一个小团队,并且有明确的评论)。

但是,我想知道这里的最佳做法。

有没有办法返回对日期格式化程序的不可变引用?如果我返回格式化程序的副本,是否比我们现在执行的分配/初始化更便宜?

这里还有其他方法吗?

我们会启动并运行它,但在编写“更好”的代码时获得一些反馈总是好的。

最佳答案

通常,您不会担心它。 Obj-C 可以让你摆弄几乎任何东西的内部。甚至 @private 也不能防止 -valueForKey:_thatFunPrivateIvar。如果一切都失败了,您可以调用运行时函数。

但是,这里最简单的解决方法是公开一个 API,该 API 在内部使用缓存的格式化程序,但不提供对其正在使用的格式化程序的访问权限。然后您的代码将使用 +[Formatter shortTimeStringFromDate:] 来执行您的示例代码现在正在执行的操作。有问题的格式化程序可以延迟分配,并且您可以使用可清除内存,以便可以在内存压力下以 LRU 方式清除缓存的格式化程序。

关于objective-c - 共享 NSDateFormatter - 最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6415384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com