2011-10-28 79 views
1

在类似于日历的应用程序或应用程序的一部分中,我需要在许多例程中使用(格雷戈里)日历,这意味着我需要alloc-init并多次释放相同的NSCalendar对象。在我的长持久控制器实例中,我应该保留一个NSCalendar(如公历日历)作为ivar(@property(nonatomic,retain))吗?我是否应该保留NSCalendar对象以供持久使用?

或者它的实例方法是否可重入/线程安全?

+0

我没有看到任何问题保持一段时间。 – JeremyP

+0

虽然我没有权威来源证明,但我仍然怀疑NSCalendar/NSDateFormatter是否真的是线程安全的。我确实看到别人的评论暗示他们不是。 – ZhangChn

回答

6

一般来说,您应该保留日历和日期格式化程序,因为它们的创建和/或第一次使用的开销很大(我发现这很困难)。

然而,Thread Safety Summary同时列出NSCalendar和NSFormatter(NSDateFormatter的超)作为“线程安全的”,他说:

下面的类和函数通常不是线程安全的。在大多数情况下,只要您一次只从一个线程使用这些类,就可以使用这些类。查看班级文档以获取更多详细信息。

我建议寻找一种方法来做到这一点。这是使用NSThread自己创建线程的一个优点:您可以将每个线程的日历存储在其thread dictionary中。

否则,您只需创建并丢弃每个日历并支付性能成本。

+0

你的推理似乎站得住脚。但我会密切关注这个问题。 – ZhangChn

+0

或者您可以利用锁定来同步对全局日历的访问,从而可以从任何线程访问它。 Objective-C中的'@ synchronized'和Swift中的'objc_sync_enter/objc_sync_exit'。您将使用全局日历对象作为要同步的对象。 –

+0

@MichaelWaterfall它只保护那段代码,而不是使用日历但不同步的任何其他代码(包括框架中的代码,包括但不限于框架)。 –

相关问题