Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Objective-C中的@synchronized_Ios_Objective C_Synchronized - Fatal编程技术网

Ios Objective-C中的@synchronized

Ios Objective-C中的@synchronized,ios,objective-c,synchronized,Ios,Objective C,Synchronized,当我调试这些代码时。首先它运行第1行,然后转到第2行。没关系,但在这之后,它再次转到第1行,然后转到第2行,然后跳出@synchronized。 但是当我打印runningOperations时,它第一次运行第2行代码时,对象没有添加到self.runningOperations中,而是在第二次添加。 为什么它会运行两次,为什么对象会在第二次添加到self.runningOperations中?如果self.runningOperation是evernil则不能用于同步。在对其调用@synchr

当我调试这些代码时。首先它运行第1行,然后转到第2行。没关系,但在这之后,它再次转到第1行,然后转到第2行,然后跳出@synchronized。 但是当我打印runningOperations时,它第一次运行第2行代码时,对象没有添加到self.runningOperations中,而是在第二次添加。
为什么它会运行两次,为什么对象会在第二次添加到self.runningOperations中?

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

巧合的是,我刚刚调试了一些代码,这些代码碰巧有一个
@synchronized

我也观察到调试器遵循第1行、第2行的模式,“跳回到”第1行,然后像正常情况一样继续,就像我一步一步地通过一样。我没有发现这是不寻常的,但是,我看到调试器做了更多不寻常的事情

我最好的猜测是,该计划,也许在较低的水平是

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

我最好的建议是不要把调试器的输出当作福音。如果你在发行版中,它几乎肯定是错误的,甚至在调试中,我看到过以不寻常的顺序突出显示步骤,我不能肯定为什么,可能只是查看代码和编译代码之间的差异。

self.runningOperations!=nil
?我认为第一次操作对象可能不存在。@如果我将它添加到第1行和第2行之间,它也会运行tiwce,但第一次它没有运行第2行([self.runningOperations addObject:operation];),所以第一次self.runningOperations为nil,但第二次它运行第2行代码,所以在第二次,自我运行操作不是零。这是什么情况?你需要更好地解释自己;我不明白你的意思。@ernaidu是的,我在第1行和第2行之间添加了if(self.runningOperations!=nil),第一次操作对象是nil,但第二次不是nil。+1同意。添加一个
NSLog
语句,查看执行是否真的发生了两次。可能不会。
@synchronized(self.runningOperations) {                      line 1
 [self.runningOperations addObject:operation];               line 2
}