What-you-can-and-what-you-cannot-do-in-_002bload.html 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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): What you can and what you cannot do in +load</title>
  20. <meta name="description" content="Using the GNU Compiler Collection (GCC): What you can and what you cannot do in +load">
  21. <meta name="keywords" content="Using the GNU Compiler Collection (GCC): What you can and what you cannot do in +load">
  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="Executing-code-before-main.html#Executing-code-before-main" rel="up" title="Executing code before main">
  30. <link href="Type-encoding.html#Type-encoding" rel="next" title="Type encoding">
  31. <link href="Executing-code-before-main.html#Executing-code-before-main" rel="prev" title="Executing code before main">
  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="What-you-can-and-what-you-cannot-do-in-_002bload"></a>
  63. <div class="header">
  64. <p>
  65. Up: <a href="Executing-code-before-main.html#Executing-code-before-main" accesskey="u" rel="up">Executing code before main</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="What-You-Can-and-Cannot-Do-in-_002bload"></a>
  69. <h4 class="subsection">8.2.1 What You Can and Cannot Do in <code>+load</code></h4>
  70. <p><code>+load</code> is to be used only as a last resort. Because it is
  71. executed very early, most of the Objective-C runtime machinery will
  72. not be ready when <code>+load</code> is executed; hence <code>+load</code> works
  73. best for executing C code that is independent on the Objective-C
  74. runtime.
  75. </p>
  76. <p>The <code>+load</code> implementation in the GNU runtime guarantees you the
  77. following things:
  78. </p>
  79. <ul>
  80. <li> you can write whatever C code you like;
  81. </li><li> you can allocate and send messages to objects whose class is implemented
  82. in the same file;
  83. </li><li> the <code>+load</code> implementation of all super classes of a class are
  84. executed before the <code>+load</code> of that class is executed;
  85. </li><li> the <code>+load</code> implementation of a class is executed before the
  86. <code>+load</code> implementation of any category.
  87. </li></ul>
  88. <p>In particular, the following things, even if they can work in a
  89. particular case, are not guaranteed:
  90. </p>
  91. <ul>
  92. <li> allocation of or sending messages to arbitrary objects;
  93. </li><li> allocation of or sending messages to objects whose classes have a
  94. category implemented in the same file;
  95. </li><li> sending messages to Objective-C constant strings (<code>@&quot;this is a
  96. constant string&quot;</code>);
  97. </li></ul>
  98. <p>You should make no assumptions about receiving <code>+load</code> in sibling
  99. classes when you write <code>+load</code> of a class. The order in which
  100. sibling classes receive <code>+load</code> is not guaranteed.
  101. </p>
  102. <p>The order in which <code>+load</code> and <code>+initialize</code> are called could
  103. be problematic if this matters. If you don&rsquo;t allocate objects inside
  104. <code>+load</code>, it is guaranteed that <code>+load</code> is called before
  105. <code>+initialize</code>. If you create an object inside <code>+load</code> the
  106. <code>+initialize</code> method of object&rsquo;s class is invoked even if
  107. <code>+load</code> was not invoked. Note if you explicitly call <code>+load</code>
  108. on a class, <code>+initialize</code> will be called first. To avoid possible
  109. problems try to implement only one of these methods.
  110. </p>
  111. <p>The <code>+load</code> method is also invoked when a bundle is dynamically
  112. loaded into your running program. This happens automatically without any
  113. intervening operation from you. When you write bundles and you need to
  114. write <code>+load</code> you can safely create and send messages to objects whose
  115. classes already exist in the running program. The same restrictions as
  116. above apply to classes defined in bundle.
  117. </p>
  118. <hr>
  119. <div class="header">
  120. <p>
  121. Up: <a href="Executing-code-before-main.html#Executing-code-before-main" accesskey="u" rel="up">Executing code before main</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>
  122. </div>
  123. </body>
  124. </html>