Fast-enumeration-details.html 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <!-- Copyright (C) 1988-2017 Free Software Foundation, Inc.
  4. Permission is granted to copy, distribute and/or modify this document
  5. under the terms of the GNU Free Documentation License, Version 1.3 or
  6. any later version published by the Free Software Foundation; with the
  7. Invariant Sections being "Funding Free Software", the Front-Cover
  8. Texts being (a) (see below), and with the Back-Cover Texts being (b)
  9. (see below). A copy of the license is included in the section entitled
  10. "GNU Free Documentation License".
  11. (a) The FSF's Front-Cover Text is:
  12. A GNU Manual
  13. (b) The FSF's Back-Cover Text is:
  14. You have freedom to copy and modify this GNU Manual, like GNU
  15. software. Copies published by the Free Software Foundation raise
  16. funds for GNU development. -->
  17. <!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
  18. <head>
  19. <title>Using the GNU Compiler Collection (GCC): Fast enumeration details</title>
  20. <meta name="description" content="Using the GNU Compiler Collection (GCC): Fast enumeration details">
  21. <meta name="keywords" content="Using the GNU Compiler Collection (GCC): Fast enumeration details">
  22. <meta name="resource-type" content="document">
  23. <meta name="distribution" content="global">
  24. <meta name="Generator" content="makeinfo">
  25. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  26. <link href="index.html#Top" rel="start" title="Top">
  27. <link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
  28. <link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
  29. <link href="Fast-enumeration.html#Fast-enumeration" rel="up" title="Fast enumeration">
  30. <link href="Fast-enumeration-protocol.html#Fast-enumeration-protocol" rel="next" title="Fast enumeration protocol">
  31. <link href="c99_002dlike-fast-enumeration-syntax.html#c99_002dlike-fast-enumeration-syntax" rel="prev" title="c99-like fast enumeration syntax">
  32. <style type="text/css">
  33. <!--
  34. a.summary-letter {text-decoration: none}
  35. blockquote.smallquotation {font-size: smaller}
  36. div.display {margin-left: 3.2em}
  37. div.example {margin-left: 3.2em}
  38. div.indentedblock {margin-left: 3.2em}
  39. div.lisp {margin-left: 3.2em}
  40. div.smalldisplay {margin-left: 3.2em}
  41. div.smallexample {margin-left: 3.2em}
  42. div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
  43. div.smalllisp {margin-left: 3.2em}
  44. kbd {font-style:oblique}
  45. pre.display {font-family: inherit}
  46. pre.format {font-family: inherit}
  47. pre.menu-comment {font-family: serif}
  48. pre.menu-preformatted {font-family: serif}
  49. pre.smalldisplay {font-family: inherit; font-size: smaller}
  50. pre.smallexample {font-size: smaller}
  51. pre.smallformat {font-family: inherit; font-size: smaller}
  52. pre.smalllisp {font-size: smaller}
  53. span.nocodebreak {white-space:nowrap}
  54. span.nolinebreak {white-space:nowrap}
  55. span.roman {font-family:serif; font-weight:normal}
  56. span.sansserif {font-family:sans-serif; font-weight:normal}
  57. ul.no-bullet {list-style: none}
  58. -->
  59. </style>
  60. </head>
  61. <body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
  62. <a name="Fast-enumeration-details"></a>
  63. <div class="header">
  64. <p>
  65. Next: <a href="Fast-enumeration-protocol.html#Fast-enumeration-protocol" accesskey="n" rel="next">Fast enumeration protocol</a>, Previous: <a href="c99_002dlike-fast-enumeration-syntax.html#c99_002dlike-fast-enumeration-syntax" accesskey="p" rel="prev">c99-like fast enumeration syntax</a>, Up: <a href="Fast-enumeration.html#Fast-enumeration" accesskey="u" rel="up">Fast enumeration</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
  66. </div>
  67. <hr>
  68. <a name="Fast-Enumeration-Details"></a>
  69. <h4 class="subsection">8.9.3 Fast Enumeration Details</h4>
  70. <p>Here is a more technical description with the gory details. Consider the code
  71. </p>
  72. <div class="smallexample">
  73. <pre class="smallexample"> for (<var>object expression</var> in <var>collection expression</var>)
  74. {
  75. <var>statements</var>
  76. }
  77. </pre></div>
  78. <p>here is what happens when you run it:
  79. </p>
  80. <ul>
  81. <li> <code><var>collection expression</var></code> is evaluated exactly once and the
  82. result is used as the collection object to iterate over. This means
  83. it is safe to write code such as <code>for (object in [NSDictionary
  84. keyEnumerator]) &hellip;</code>.
  85. </li><li> the iteration is implemented by the compiler by repeatedly getting
  86. batches of objects from the collection object using the fast
  87. enumeration protocol (see below), then iterating over all objects in
  88. the batch. This is faster than a normal enumeration where objects are
  89. retrieved one by one (hence the name &ldquo;fast enumeration&rdquo;).
  90. </li><li> if there are no objects in the collection, then
  91. <code><var>object expression</var></code> is set to <code>nil</code> and the loop
  92. immediately terminates.
  93. </li><li> if there are objects in the collection, then for each object in the
  94. collection (in the order they are returned) <code><var>object expression</var></code>
  95. is set to the object, then <code><var>statements</var></code> are executed.
  96. </li><li> <code><var>statements</var></code> can contain <code>break</code> and <code>continue</code>
  97. commands, which will abort the iteration or skip to the next loop
  98. iteration as expected.
  99. </li><li> when the iteration ends because there are no more objects to iterate
  100. over, <code><var>object expression</var></code> is set to <code>nil</code>. This allows
  101. you to determine whether the iteration finished because a <code>break</code>
  102. command was used (in which case <code><var>object expression</var></code> will remain
  103. set to the last object that was iterated over) or because it iterated
  104. over all the objects (in which case <code><var>object expression</var></code> will be
  105. set to <code>nil</code>).
  106. </li><li> <code><var>statements</var></code> must not make any changes to the collection
  107. object; if they do, it is a hard error and the fast enumeration
  108. terminates by invoking <code>objc_enumerationMutation</code>, a runtime
  109. function that normally aborts the program but which can be customized
  110. by Foundation libraries via <code>objc_set_mutation_handler</code> to do
  111. something different, such as raising an exception.
  112. </li></ul>
  113. <hr>
  114. <div class="header">
  115. <p>
  116. Next: <a href="Fast-enumeration-protocol.html#Fast-enumeration-protocol" accesskey="n" rel="next">Fast enumeration protocol</a>, Previous: <a href="c99_002dlike-fast-enumeration-syntax.html#c99_002dlike-fast-enumeration-syntax" accesskey="p" rel="prev">c99-like fast enumeration syntax</a>, Up: <a href="Fast-enumeration.html#Fast-enumeration" accesskey="u" rel="up">Fast enumeration</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
  117. </div>
  118. </body>
  119. </html>