我的团队发现我们在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
Run Code Online (Sandbox Code Playgroud)
我对这种方法的一个问题是,我们目前没有"保护" NSDateFormatter不被改变.由于格式化程序在我们的应用程序中基本上是"共享"的,如果另一个对象要更改格式化程序的配置(例如时间/日期样式),这可能会导致问题.
因为我们在内部使用它,所以我并不过分关注我们团队滥用此功能的风险(即它是一个小团队,并且明确评论).
但是,我想知道这里的最佳做法.
有没有办法将不可变引用返回到日期格式化程序?如果我返回格式化程序的副本,是否比我们现在正在执行的alloc/inits更便宜?
还有其他方法可以带到这里吗?
我们将开始运行,但在编写"更好"的代码时得到一些反馈总是好的.
我有一个自定义UITableViewCell,我正在使用nib实例化instantiateWithOwner:(id)owner options:(NSDictionary *)options.当实例化nib时,我将其保存到我的视图控制器中定义的IBOutlet,该控制器在.xib文件中设置为文件的所有者.一切都很好.
我现在遇到了在多个视图控制器中使用此自定义单元的需要.我希望我可以定义一个协议(例如CustomCellOwner),多个视图控制器可以实现.该协议将简单地定义用于在实例化时引用该单元的IBOutlet.
理想情况下,我想将"文件所有者"设置为:
id <CustomCellOwner>
Run Code Online (Sandbox Code Playgroud)
在Interface Builder中.
但是,Interface Builder似乎只允许您将文件所有者设置为已知类,而不是实现协议的id?
有没有办法做到这一点?或者,一种更简单的方法来解决这个问题?
谢谢!