Fast-enumeration-protocol.html 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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 protocol</title>
  20. <meta name="description" content="Using the GNU Compiler Collection (GCC): Fast enumeration protocol">
  21. <meta name="keywords" content="Using the GNU Compiler Collection (GCC): Fast enumeration protocol">
  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="Messaging-with-the-GNU-Objective_002dC-runtime.html#Messaging-with-the-GNU-Objective_002dC-runtime" rel="next" title="Messaging with the GNU Objective-C runtime">
  31. <link href="Fast-enumeration-details.html#Fast-enumeration-details" rel="prev" title="Fast enumeration details">
  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-protocol"></a>
  63. <div class="header">
  64. <p>
  65. Previous: <a href="Fast-enumeration-details.html#Fast-enumeration-details" accesskey="p" rel="prev">Fast enumeration details</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-Protocol"></a>
  69. <h4 class="subsection">8.9.4 Fast Enumeration Protocol</h4>
  70. <p>If you want your own collection object to be usable with fast
  71. enumeration, you need to have it implement the method
  72. </p>
  73. <div class="smallexample">
  74. <pre class="smallexample">- (unsigned long) countByEnumeratingWithState: (NSFastEnumerationState *)state
  75. objects: (id *)objects
  76. count: (unsigned long)len;
  77. </pre></div>
  78. <p>where <code>NSFastEnumerationState</code> must be defined in your code as follows:
  79. </p>
  80. <div class="smallexample">
  81. <pre class="smallexample">typedef struct
  82. {
  83. unsigned long state;
  84. id *itemsPtr;
  85. unsigned long *mutationsPtr;
  86. unsigned long extra[5];
  87. } NSFastEnumerationState;
  88. </pre></div>
  89. <p>If no <code>NSFastEnumerationState</code> is defined in your code, the
  90. compiler will automatically replace <code>NSFastEnumerationState *</code>
  91. with <code>struct __objcFastEnumerationState *</code>, where that type is
  92. silently defined by the compiler in an identical way. This can be
  93. confusing and we recommend that you define
  94. <code>NSFastEnumerationState</code> (as shown above) instead.
  95. </p>
  96. <p>The method is called repeatedly during a fast enumeration to retrieve
  97. batches of objects. Each invocation of the method should retrieve the
  98. next batch of objects.
  99. </p>
  100. <p>The return value of the method is the number of objects in the current
  101. batch; this should not exceed <code>len</code>, which is the maximum size of
  102. a batch as requested by the caller. The batch itself is returned in
  103. the <code>itemsPtr</code> field of the <code>NSFastEnumerationState</code> struct.
  104. </p>
  105. <p>To help with returning the objects, the <code>objects</code> array is a C
  106. array preallocated by the caller (on the stack) of size <code>len</code>.
  107. In many cases you can put the objects you want to return in that
  108. <code>objects</code> array, then do <code>itemsPtr = objects</code>. But you
  109. don&rsquo;t have to; if your collection already has the objects to return in
  110. some form of C array, it could return them from there instead.
  111. </p>
  112. <p>The <code>state</code> and <code>extra</code> fields of the
  113. <code>NSFastEnumerationState</code> structure allows your collection object
  114. to keep track of the state of the enumeration. In a simple array
  115. implementation, <code>state</code> may keep track of the index of the last
  116. object that was returned, and <code>extra</code> may be unused.
  117. </p>
  118. <p>The <code>mutationsPtr</code> field of the <code>NSFastEnumerationState</code> is
  119. used to keep track of mutations. It should point to a number; before
  120. working on each object, the fast enumeration loop will check that this
  121. number has not changed. If it has, a mutation has happened and the
  122. fast enumeration will abort. So, <code>mutationsPtr</code> could be set to
  123. point to some sort of version number of your collection, which is
  124. increased by one every time there is a change (for example when an
  125. object is added or removed). Or, if you are content with less strict
  126. mutation checks, it could point to the number of objects in your
  127. collection or some other value that can be checked to perform an
  128. approximate check that the collection has not been mutated.
  129. </p>
  130. <p>Finally, note how we declared the <code>len</code> argument and the return
  131. value to be of type <code>unsigned long</code>. They could also be declared
  132. to be of type <code>unsigned int</code> and everything would still work.
  133. </p>
  134. <hr>
  135. <div class="header">
  136. <p>
  137. Previous: <a href="Fast-enumeration-details.html#Fast-enumeration-details" accesskey="p" rel="prev">Fast enumeration details</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>
  138. </div>
  139. </body>
  140. </html>