установка формата ивара NSDateFormatter несколько раз - PullRequest
0 голосов
/ 06 августа 2011

В одном из моих контроллеров представления у меня есть много разных форматов для дат, поэтому я решил создать ivar в моем заголовочном файле

NSDateFormatter *dateFormatter;

, а затем я использую его с разными форматами в разныхметоды в моем файле реализации

dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"EEEE, MMM dd"];
//do something with this
[dateFormatter setDateFormat:@"y-MM-dd HH:mm:ss"];
//do something with this
etc

Это нормально делать?это то, что они имеют в виду, кэшируя ваши nsdateformatters?

Кажется, это работает нормально, когда я просто собираю => запустить, но когда я включаю зомби, мое приложение вылетает, и malloc_history показывает кучу alloc / free с dateformatдругой текст, связанный с датой.Вот пример выделения

ALLOC 0x5e37930-0x5e3799b [size=108]: thread_accc52c0 |start | main | 
UIApplicationMain | GSEventRun | GSEventRunModal | CFRunLoopRunInMode | 
CFRunLoopRunSpecific | __CFRunLoopRun | __CFRunLoopDoObservers | 
__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ | 
CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) | 
CA::Transaction::commit() | CA::Context::commit_transaction(CA::Transaction*) | 
CALayerLayoutIfNeeded | -[CALayer layoutSublayers] | -[UITableView layoutSubviews]
 | -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] | -
[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] | -
[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] 
| -[EventsTableController tableView:cellForRowAtIndexPath:] | -[NSDateFormatter 
dateFromString:] | -[NSDateFormatter getObjectValue:forString:errorDescription:] 
| getObjectValue | CFDateFormatterCreateDateFromString | 
CFDateFormatterGetAbsoluteTimeFromString | udat_parse | 
icu::DateFormat::parse(icu::UnicodeString const&, icu::ParsePosition&) const | 
icu::SimpleDateFormat::parse(icu::UnicodeString const&, icu::Calendar&, 
icu::ParsePosition&) const | icu::SimpleDateFormat::subParse(icu::UnicodeString 
const&, int&, unsigned short, int, signed char, signed char, signed char*, int&, 
icu::Calendar&, int) const | icu::SimpleDateFormat::parseInt(icu::UnicodeString 
const&, icu::Formattable&, int, icu::ParsePosition&, signed char, 
icu::NumberFormat*) const | icu::DecimalFormat::parse(icu::UnicodeString const&, 
icu::Formattable&, icu::ParsePosition&) const | 
icu::DecimalFormat::parse(icu::UnicodeString const&, icu::Formattable&, 
icu::ParsePosition&, signed char) const | icu::DecimalFormat::subparse(icu::UnicodeString const&, 
icu::UnicodeString const*, icu::UnicodeString const*, icu::UnicodeString const*, 
icu::UnicodeString const*, signed char, signed char, icu::ParsePosition&, 
icu::DigitList&, signed char*, unsigned short*) const | 
icu::DecimalFormat::compareSimpleAffix(icu::UnicodeString const&, icu::UnicodeString 
const&, int, signed char) | uprv_decNumberInvert | uprv_decNumberInvert | 
icu::UnicodeSet::UnicodeSet(icu::UnicodeSet const&) | malloc | malloc_zone_malloc 

Заранее спасибо

1 Ответ

1 голос
/ 06 августа 2011

Допустимо иметь один экземпляр NSDateFormatter и многократно менять формат, если только это делается в одном потоке, и вы продолжаете делать то, что делаете.

Но вы должны только создатьNSDateFormatter один раз, в вашей подпрограмме инициализации - не создавайте его в каждой подпрограмме, которая его использует.И обязательно удалите форматтер из вашей процедуры dealloc.

...