多次设置ivar NSDateFormatter的格式

时间:2011-08-06 02:02:46

标签: iphone caching nsdateformatter

在我的一个视图控制器中,我有很多不同的日期格式,所以我决定在我的头文件中创建一个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

的例子
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 个答案:

答案 0 :(得分:1)

拥有NSDateFormatter的单个实例并重复更改格式是合法的,只要这只在一个线程中完成并且你保持你正在做的事情。

但是你应该只在init例程中创建一次NSDateFormatter - 不要在每个使用它的例程中创建它。并确保在dealloc例程中删除格式化程序。