【问题标题】:Why is stop a BOOL pointer in enumerateObjectsUsingBlock:? [duplicate]为什么在 enumerateObjectsUsingBlock: 中停止 BOOL 指针? [复制]
【发布时间】:2013-05-06 19:35:01
【问题描述】:

我了解what the stop parameter is for,但我很好奇为什么这是一个BOOL * 而不仅仅是一个BOOL。是因为值本身需要存在于块范围之外,以便enumerateObjectsUsingBlock: 可以访问块本身可能分配给它的值吗?

【问题讨论】:

标签: objective-c


【解决方案1】:

要回答您的问题(虽然它看起来像一个骗子),该块需要告诉它的调用者停止枚举,如果它找到了它正在寻找的东西。 C中有两种选择:

  • return YES 继续或return NO 停止。
  • 在调用者的范围内设置一个变量,因此BOOL *

Apple 选择了第二种方法,尽管我认为第一种方法既简单(少一个参数)也更直观。

它不能只是BOOL,因为它只设置了变量的本地副本,而不是调用者范围内的变量。

【讨论】:

  • 使用第二种技术可以产生的一个区别是,块可以访问上一次迭代关于停止的决定。当然,(不幸的是?)没有记录以这种方式工作 - 不能保证 stop 值在每一步都是相同的。
  • @JoshCaswell 但大概它必须始终是 NO 否则不会再次进入该块?
  • bbum 对我对关于并发枚举和停止标志为“建议”的另一个问题的回答发表了评论;这就是我正在考虑的情况。目前尚不清楚枚举是否总是可能继续,或者仅在请求并发时。在这些情况下,能够发出“我已经知道我已经完成了”的信号可能会很方便,当然如果有必要的话,你可以有一个本地的 __block 变量。
  • @JoshCaswell 是的,这个区块的“合约”似乎没有很好的定义;似乎有很多事后的猜测。
猜你喜欢
  • 1970-01-01
  • 2021-04-08
  • 2019-03-05
  • 2012-03-27
  • 2014-08-04
  • 1970-01-01
  • 2021-11-29
相关资源
最近更新 更多