【问题标题】:Should I retain NSCalendar object for a persistent use?我应该保留 NSCalendar 对象以供持久使用吗?
【发布时间】:2011-10-28 07:59:40
【问题描述】:

在类日历应用程序或应用程序的一部分中,我需要在许多例程中使用(公历)日历,这意味着我需要多次分配初始化和释放相同的 NSCalendar 对象。我应该在我的长持久控制器实例中保留一个 NSCalendar(比如公历)作为 ivar(@property(nonatomic,retain)) 吗?

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

【问题讨论】:

  • 我看不出有什么问题,把一个放在身边。
  • 虽然我没有权威的资料可以证明,但我仍然怀疑 NSCalendar/NSDateFormatter 是否真的是线程安全的。我确实看到其他人的 cmets 暗示他们不是。

标签: objective-c ios cocoa foundation nscalendar


【解决方案1】:

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

但是,Thread Safety Summary 将 NSCalendar 和 NSFormatter(NSDateFormatter 的超类)都列为“线程不安全”,并表示:

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

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

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

【讨论】:

  • 你的推理似乎站得住脚。但我会密切关注这个问题。
  • 或者您可以利用锁定来同步访问您的全局日历,从而能够从任何线程访问它。 Objective-C 中的 @synchronized 和 Swift 中的 objc_sync_enter/objc_sync_exit。您将使用全局日历对象作为要同步的对象。
  • @MichaelWaterfall 只保护那段代码,不保护任何其他使用日历但不同步的代码(包括框架中的代码,包括但不限于框架)。
  • 截至 2014 年,NSCalendar 现在是线程安全的:developer.apple.com/library/content/documentation/Cocoa/…
猜你喜欢
  • 2017-02-16
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多