Форматирование даты и времени в ячейках UITableView

Мне нужно отформатировать дату и время в 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 Solutions collect form web for “Форматирование даты и времени в ячейках UITableView”

Я бы не использовал статическую переменную, потому что тогда вы почти наверняка закончите утечку памяти. Вместо этого я бы использовал два экземпляра или свойства экземпляра 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 

Я читал в разных местах, что если вы используете 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 экземпляра форматирования будут работать в течение всего периода выполнения), но создание форматирования – это тяжелая операция, поэтому этот подход значительно улучшает производительность вашего метода

Вы можете использовать это для повторного использования NSDateFormatter: https://github.com/DougFischer/DFDateFormatterFactory#readme

PS: Поскольку вы устанавливаете только формат и локаль для своих форматировщиков данных.

  • Почему верхняя часть моего UISegmentedControl не поддерживается?
  • преобразование UITableView для поддержки права на левые языки
  • Попытка переместить вид вверх, когда клавиатура показывается
  • Как я могу оживить сжатие uiwebview?
  • otest crash с -
  • Как вы конвертируете код IPhone OSStatus в что-то полезное?
  • CloudKit: зона была очищена пользователем
  • Покупка iOS In-App работает в разработке, но не в производстве
  • Установить язык по умолчанию при первом запуске IOS
  • Изменение canDisplayBannerAds на NO не обновляет вид, чтобы удалить рекламный баннер
  • как установить cornerRadius только для верхнего левого и верхнего правого угла UIView?
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.