为什么在enumerateObjectsUsingBlock中stop是BOOL指针?

4

我理解 stop 参数的作用是什么, 但我好奇的是为什么这是一个 BOOL * 而不是只有一个 BOOL。是因为该值本身需要存在块范围之外,以便 enumerateObjectsUsingBlock: 可以访问由块自身分配给它的值吗?


我刚才是在问这个小黄鸭吗?http://www.codinghorror.com/blog/2012/03/rubber-duck-problem-solving.html - ybakos
所引用的重复内容并未回答问题“为什么参数是指针?” - ybakos
1
是的,它确实如此;我的回答的最后一部分正是解释了这一点。 - jscs
啊,我错过了那个。谢谢你指出来。 - ybakos
1个回答

4
回答你的问题(尽管看起来是重复),如果块找到了它要查找的内容,就需要告诉它的调用者停止枚举。在C语言中有两个选择:
  • 返回YES以继续或返回NO以停止。
  • 在调用者的作用域中设置一个变量,因此需要使用BOOL *
苹果公司选择了第二种方法,尽管我认为第一种方法更简单(少一个参数)并且更直观。
这不能只是BOOL,因为这只设置了变量的本地副本,而不是调用者作用域中的变量。

使用第二种技术可能会产生的一个不同之处是,块可以访问上一次迭代关于停止的决定。当然,遗憾的是,并没有记录以这种方式工作--不能保证在每个步骤中“stop”值相同。 - jscs
1
@JoshCaswell 但是假设它总是NO,否则该块将不会再次输入? - trojanfoe
bbum在我的另一个关于并发枚举和停止标志是“咨询性”的答案上发表了评论;那就是我所考虑的情况。现在还不完全清楚是否总是可以继续枚举,或者只有在请求并发时才能继续。在这些情况下,如果能够发出“我已经弄清楚我完成了”的信号,那将非常方便,尽管如果必要的话,你也可以有一个本地的__block变量。 - jscs
@JoshCaswell 嗯,看起来这个块的“契约”没有定义得很好;似乎有很多猜测。 - trojanfoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接