/* Page prose (zh-Hans) */
"ClassicBugUnbalancedEnterLeave" = "# 经典错误：`enter`/`leave` 不平衡\n\n一个 Dispatch Group 的正确程度，取决于你的记账。这条规则是绝对的：**每一次 `enter()` 都对应恰好一次 `leave()`，在每一条路径上。** 无论朝哪个方向破坏它，你都会得到一种截然不同的失败。\n\n`leave()` 太少，组就会挂起。在某条代码路径上漏掉一次 `leave()`，计数器就永远回不到零。`notify` 永远不会触发；`wait()` 会永远等待。";
"ClassicBugUnbalancedEnterLeave-2" = "上面那些名字都不是空的，所以它碰巧能正常工作，但这种写法本身就是危险所在。\n\n* callout(试一试): 往数组里加一个空字符串 `\"\"`，再运行一次。那个空名字会命中 `guard` 并在*没有*调用 `leave()` 的情况下返回，于是组的计数器永远回不到零。结果是：三杯真实的饮品会打印出来，但 `This may never print…` 永远不会，而这一页会一直运行下去，直到你自己把它停掉。那种悄无声息的挂起，没有崩溃也没有报错，只是一个永远不到来的“全部完成”，这就是全部的错误所在。\n\n> 一旦 `guard`、`throw` 或某个错误分支在 `leave()` 之前返回，那个任务就永远不会离开这个组，而你的“全部完成”回调也就悄无声息地永远不会运行。**在 `enter()` 之后紧跟一个 `defer { group.leave() }`，能保证在每一条退出路径上都会 leave**，这是标准的解药。\n\n`leave()` 太多则会造成崩溃。调用 `leave()` 的次数比你调用 `enter()` 的次数还多，组的计数就会变成负数，从而在运行时中断，并给出类似 *\"Unbalanced call to dispatch_group_leave.\"* 的错误。这通常来自把 `enter()` 放错了位置：比如在循环*外面*只调用它一次，却在每一次迭代*里面*调用 `leave()`。计数器在第一个任务之后就归零，`notify` 在其他任务还在运行时就**过早地过度触发**，而那些多出来的 leave 随后就会崩溃。让 `enter()` 和 `leave()` 在同一层级上成对出现。\n\n[上一页](@previous)  |  第 5 / 8 页  |  [下一页: DispatchSemaphore：限制同时运行的数量](@next)";
