在UITableView单元格中格式化日期和时间

时间:2010-12-15 18:34:49

标签: iphone ios objective-c cocoa-touch nsdateformatter

我需要在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;
}

3 个答案:

答案 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:由于您只为数据格式化程序设置了格式和区域设置。