我需要在tableView:cellForRowAtIndexPath:
中格式化日期和时间。由于创建NSDateFormatter
是一项相当繁重的操作,因此我将它们设置为静态。这是以行为单位格式化日期和时间的最佳方法吗?
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
MyCell*cell = (MyCell*)[self.tableView
dequeueReusableCellWithIdentifier:CellIdentifier
forIndexPath:indexPath];
static NSDateFormatter *dateFormatter = nil;
if (!dateFormatter)
{
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[NSLocale currentLocale]];
[dateFormatter setDateStyle:NSDateFormatterLongStyle];
}
cell.dateLabel = [dateFormatter stringFromDate:note.timestamp];
static NSDateFormatter *timeFormatter = nil;
if (!timeFormatter)
{
timeFormatter = [[NSDateFormatter alloc] init];
[timeFormatter setTimeStyle:NSDateFormatterShortStyle];
}
cell.timeLabel = [timeFormatter stringFromDate:note.timestamp];
return cell;
}
答案 0 :(得分:7)
我不会使用静态变量,因为那时你几乎肯定会遇到内存泄漏。相反,我会在该控制器对象上使用两个NSDateFormatter *
实例变量或属性,这些变量或属性仅在需要时实例化。当视图卸载或控制器被释放时,您可以释放它们。
例如:
@interface MyViewController : UITableViewController {
NSDateFormatter *dateFormatter;
NSDateFormatter *timeFormatter;
}
@end
@implementation MyViewController
- (void)viewDidUnload {
// release date and time formatters, since the view is no longer in memory
[dateFormatter release]; dateFormatter = nil;
[timeFormatter release]; timeFormatter = nil;
[super viewDidUnload];
}
- (void)dealloc {
// release date and time formatters, since this view controller is being
// destroyed
[dateFormatter release]; dateFormatter = nil;
[timeFormatter release]; timeFormatter = nil;
[super dealloc];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// ...
// if a date formatter doesn't exist yet, create it
if (!dateFormatter) {
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[NSLocale currentLocale]];
[dateFormatter setDateStyle:NSDateFormatterLongStyle];
}
cell.dateLabel = [dateFormatter stringFromDate:note.timestamp];
// if a time formatter doesn't exist yet, create it
if (!timeFormatter) {
timeFormatter = [[NSDateFormatter alloc] init];
[timeFormatter setTimeStyle:NSDateFormatterShortStyle];
}
cell.timeLabel = [timeFormatter stringFromDate:note.timestamp];
return cell;
}
@end
答案 1 :(得分:2)
我已经在各个地方读过,如果 你正在使用NSDateFormatter, 你应该设置一个静态变量, 但在测试这种方法时我发现了它 用完了更多的记忆。
但是在您的代码中,您不会为格式化程序使用静态变量。请尝试以下修改:
static NSDateFormatter *dateFormatter = nil;
if (!dateFormatter){
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[NSLocale currentLocale]];
[dateFormatter setDateStyle:NSDateFormatterLongStyle];
}
cell.dateLabel = [dateFormatter stringFromDate:note.timestamp];
// And same approach for timeFormatter
这可能无法节省您的内存(因为您的2个格式化程序实例将在所有运行时间段内进行处理),但创建格式化程序本身就是繁重的操作,因此这种方法可以显着提高您的方法性能
答案 2 :(得分:0)
您可以使用它来处理NSDateFormatter的重用: https://github.com/DougFischer/DFDateFormatterFactory#readme
P.S:由于您只为数据格式化程序设置了格式和区域设置。