【问题标题】:the @synchronized in Objective-CObjective-C 中的 @synchronized
【发布时间】:2013-08-23 10:18:22
【问题描述】:
@synchronized(self.runningOperations) {                      line 1
 [self.runningOperations addObject:operation];               line 2
} 

当我调试这些代码的时候,一开始运行第1行,然后到第2行。没关系,但是之后又到第1行,然后到第2行,然后跳出@同步的。 但是当我打印 runningOperations 时,它第一次运行第 2 行代码时,对象没有添加到 self.runningOperations 中,它是在第二次添加的。 为什么它会运行两次,为什么第二次将 Object 添加到 self.runningOperations 中?

【问题讨论】:

  • self.runningOperations != nil?
  • 我认为第一次操作对象可能不存在。
  • @trojanfoe 我在第 1 行和第 2 行之间添加它,它也运行 tiwce,但第一次没有运行第 2 行([self.runningOperations addObject:operation];),所以第一次 self.runningOperations 为 nil,但第二次运行第 2 行代码,所以第二次 self.runningOperations 不是 nil。这是什么情况?
  • 你需要更好地解释自己;我不明白你的意思。
  • @ernaidu 是的,我在第 1 行和第 2 行之间添加了 if(self.runningOperations != nil),第一次操作对象是 nil,但第二次不是 nil。

标签: ios objective-c synchronized


【解决方案1】:

巧合的是,我刚刚调试了一些恰好有@synchronised 的代码。

我也观察到调试器遵循 line1、line2、“跳回”到 line1 的模式,然后正常运行,因为我逐步完成。然而,我并没有发现这很不寻常,我看到调试器做了更多不寻常的事情。

我最好的猜测是该程序,也许在较低级别是

  • 在开始时对锁不做任何事情,但调试器仍会通过该行
  • 输入同步代码(此时获得锁至关重要)
  • 检查锁
  • 然后开始执行原子代码。

我最好的建议是不要把调试器的输出当成福音。如果您在发布中,几乎可以保证是错误的,甚至在调试中,我已经看到以不寻常的顺序突出显示逐步执行,我无法确定为什么,可能只是查看的代码和编译的代码之间存在差异。

【讨论】:

  • +1 同意。添加NSLog 语句以查看执行是否真的发生了两次。可能不会。
【解决方案2】:

如果self.runningOperation 曾经是nil,则它不能用于同步。确保在调用 @synchronized() 之前对其进行初始化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 2010-11-15
    • 2021-06-07
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    相关资源
    最近更新 更多