| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 1 | <html> | 
|  | 2 | <head> | 
|  | 3 | <title>Objective-C Automatic Reference Counting (ARC)</title> | 
|  | 4 | <link type="text/css" rel="stylesheet" href="../menu.css" /> | 
|  | 5 | <link type="text/css" rel="stylesheet" href="../content.css" /> | 
|  | 6 | <style type="text/css"> | 
|  | 7 | /* Collapse the items in the ToC to the left. */ | 
|  | 8 | div#toc ul { | 
|  | 9 | padding-left: 0 | 
|  | 10 | } | 
|  | 11 |  | 
|  | 12 | /* Rationales appear in italic. */ | 
|  | 13 | div.rationale { | 
|  | 14 | font-style: italic | 
|  | 15 | } | 
|  | 16 |  | 
| John McCall | f3d08a6 | 2011-06-18 07:31:30 +0000 | [diff] [blame] | 17 | div.rationale em { | 
|  | 18 | font-style: normal | 
|  | 19 | } | 
|  | 20 |  | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 21 | div h1 { font-size: 2em; margin: .67em 0 } | 
|  | 22 | div div h1 { font-size: 1.5em; margin: .75em 0 } | 
|  | 23 | div div div h1 { font-size: 1.17em; margin: .83em 0 } | 
|  | 24 | div div div div h1 { margin: 1.12em 0 } | 
|  | 25 |  | 
|  | 26 | span.term { font-style: italic; font-weight: bold  } | 
|  | 27 | </style> | 
|  | 28 |  | 
|  | 29 | <script lang="javascript"> | 
|  | 30 | /// A little script to recursively build a table of contents. | 
|  | 31 | function buildTOC(div, toc, ancestry) { | 
|  | 32 | var children = div.childNodes; | 
|  | 33 | var len = children.length; | 
|  | 34 |  | 
|  | 35 | var childNumber = 0; | 
|  | 36 |  | 
|  | 37 | var list = null; | 
|  | 38 | for (var i = 0; i < len; ++i) { | 
|  | 39 | var child = children[i]; | 
|  | 40 | if (child.nodeName != "DIV") continue; | 
|  | 41 | if (child.getAttribute("class") == "rationale") continue; | 
|  | 42 | if (child.id == "toc") continue; | 
|  | 43 |  | 
|  | 44 | // Okay, we're actually going to build a list node. | 
|  | 45 | if (list === null) list = document.createElement("ul"); | 
|  | 46 |  | 
|  | 47 | var childAncestry = ancestry + ++childNumber + "."; | 
|  | 48 |  | 
|  | 49 | var headerNode = child.childNodes[1]; | 
|  | 50 | var title = headerNode.innerHTML; | 
|  | 51 | headerNode.insertBefore(document.createTextNode(childAncestry + " "), | 
|  | 52 | headerNode.firstChild); | 
|  | 53 |  | 
|  | 54 | var item = document.createElement("li"); | 
|  | 55 | item.appendChild(document.createTextNode(childAncestry + " ")); | 
|  | 56 |  | 
|  | 57 | var anchor = document.createElement("a"); | 
|  | 58 | anchor.href = "#" + child.id; | 
|  | 59 | anchor.innerHTML = title; | 
|  | 60 | item.appendChild(anchor); | 
|  | 61 |  | 
|  | 62 | buildTOC(child, item, childAncestry); | 
|  | 63 |  | 
|  | 64 | list.appendChild(item); | 
|  | 65 | } | 
|  | 66 | if (list) toc.appendChild(list); | 
|  | 67 | } | 
|  | 68 |  | 
|  | 69 | function onLoad() { | 
|  | 70 | var toc = document.getElementById("toc"); | 
|  | 71 | var content = document.getElementById("content"); | 
|  | 72 | buildTOC(content, toc, ""); | 
|  | 73 | } | 
|  | 74 | window.onload = onLoad; | 
|  | 75 |  | 
|  | 76 | </script> | 
|  | 77 | </head> | 
|  | 78 | <body> | 
|  | 79 |  | 
|  | 80 | <!--#include virtual="../menu.html.incl"--> | 
|  | 81 |  | 
|  | 82 | <div id="content"> | 
|  | 83 | <h1>Automatic Reference Counting</h1> | 
|  | 84 |  | 
|  | 85 | <div id="toc"> | 
|  | 86 | </div> | 
|  | 87 |  | 
|  | 88 | <div id="meta"> | 
|  | 89 | <h1>About this document</h1> | 
|  | 90 |  | 
|  | 91 | <div id="meta.purpose"> | 
|  | 92 | <h1>Purpose</h1> | 
|  | 93 |  | 
|  | 94 | <p>The first and primary purpose of this document is to serve as a | 
|  | 95 | complete technical specification of Automatic Reference Counting. | 
|  | 96 | Given a core Objective-C compiler and runtime, it should be possible | 
|  | 97 | to write a compiler and runtime which implements these new | 
|  | 98 | semantics.</p> | 
|  | 99 |  | 
|  | 100 | <p>The secondary purpose is to act as a rationale for why ARC was | 
|  | 101 | designed in this way.  This should remain tightly focused on the | 
|  | 102 | technical design and should not stray into marketing speculation.</p> | 
|  | 103 |  | 
|  | 104 | </div> <!-- meta.purpose --> | 
|  | 105 |  | 
|  | 106 | <div id="meta.background"> | 
|  | 107 | <h1>Background</h1> | 
|  | 108 |  | 
|  | 109 | <p>This document assumes a basic familiarity with C.</p> | 
|  | 110 |  | 
|  | 111 | <p><span class="term">Blocks</span> are a C language extension for | 
|  | 112 | creating anonymous functions.  Users interact with and transfer block | 
|  | 113 | objects using <span class="term">block pointers</span>, which are | 
|  | 114 | represented like a normal pointer.  A block may capture values from | 
|  | 115 | local variables; when this occurs, memory must be dynamically | 
|  | 116 | allocated.  The initial allocation is done on the stack, but the | 
|  | 117 | runtime provides a <tt>Block_copy</tt> function which, given a block | 
|  | 118 | pointer, either copies the underlying block object to the heap, | 
|  | 119 | setting its reference count to 1 and returning the new block pointer, | 
|  | 120 | or (if the block object is already on the heap) increases its | 
|  | 121 | reference count by 1.  The paired function is <tt>Block_release</tt>, | 
|  | 122 | which decreases the reference count by 1 and destroys the object if | 
|  | 123 | the count reaches zero and is on the heap.</p> | 
|  | 124 |  | 
|  | 125 | <p>Objective-C is a set of language extensions, significant enough to | 
|  | 126 | be considered a different language.  It is a strict superset of C. | 
|  | 127 | The extensions can also be imposed on C++, producing a language called | 
|  | 128 | Objective-C++.  The primary feature is a single-inheritance object | 
|  | 129 | system; we briefly describe the modern dialect.</p> | 
|  | 130 |  | 
|  | 131 | <p>Objective-C defines a new type kind, collectively called | 
|  | 132 | the <span class="term">object pointer types</span>.  This kind has two | 
|  | 133 | notable builtin members, <tt>id</tt> and <tt>Class</tt>; <tt>id</tt> | 
|  | 134 | is the final supertype of all object pointers.  The validity of | 
|  | 135 | conversions between object pointer types is not checked at runtime. | 
|  | 136 | Users may define <span class="term">classes</span>; each class is a | 
|  | 137 | type, and the pointer to that type is an object pointer type.  A class | 
|  | 138 | may have a superclass; its pointer type is a subtype of its | 
|  | 139 | superclass's pointer type.  A class has a set | 
|  | 140 | of <span class="term">ivars</span>, fields which appear on all | 
|  | 141 | instances of that class.  For every class <i>T</i> there's an | 
|  | 142 | associated metaclass; it has no fields, its superclass is the | 
|  | 143 | metaclass of <i>T</i>'s superclass, and its metaclass is a global | 
|  | 144 | class.  Every class has a global object whose class is the | 
|  | 145 | class's metaclass; metaclasses have no associated type, so pointers to | 
|  | 146 | this object have type <tt>Class</tt>.</p> | 
|  | 147 |  | 
|  | 148 | <p>A class declaration (<tt>@interface</tt>) declares a set | 
|  | 149 | of <span class="term">methods</span>.  A method has a return type, a | 
|  | 150 | list of argument types, and a <span class="term">selector</span>: a | 
|  | 151 | name like <tt>foo:bar:baz:</tt>, where the number of colons | 
|  | 152 | corresponds to the number of formal arguments.  A method may be an | 
|  | 153 | instance method, in which case it can be invoked on objects of the | 
|  | 154 | class, or a class method, in which case it can be invoked on objects | 
|  | 155 | of the metaclass.  A method may be invoked by providing an object | 
|  | 156 | (called the <span class="term">receiver</span>) and a list of formal | 
|  | 157 | arguments interspersed with the selector, like so:</p> | 
|  | 158 |  | 
|  | 159 | <pre>[receiver foo: fooArg bar: barArg baz: bazArg]</pre> | 
|  | 160 |  | 
|  | 161 | <p>This looks in the dynamic class of the receiver for a method with | 
|  | 162 | this name, then in that class's superclass, etc., until it finds | 
|  | 163 | something it can execute.  The receiver <q>expression</q> may also be | 
|  | 164 | the name of a class, in which case the actual receiver is the class | 
|  | 165 | object for that class, or (within method definitions) it may | 
|  | 166 | be <tt>super</tt>, in which case the lookup algorithm starts with the | 
|  | 167 | static superclass instead of the dynamic class.  The actual methods | 
|  | 168 | dynamically found in a class are not those declared in the | 
|  | 169 | <tt>@interface</tt>, but those defined in a separate | 
|  | 170 | <tt>@implementation</tt> declaration; however, when compiling a | 
|  | 171 | call, typechecking is done based on the methods declared in the | 
|  | 172 | <tt>@interface</tt>.</p> | 
|  | 173 |  | 
|  | 174 | <p>Method declarations may also be grouped into | 
|  | 175 | <span class="term">protocols</span>, which are not inherently | 
|  | 176 | associated with any class, but which classes may claim to follow. | 
|  | 177 | Object pointer types may be qualified with additional protocols that | 
|  | 178 | the object is known to support.</p> | 
|  | 179 |  | 
|  | 180 | <p><span class="term">Class extensions</span> are collections of ivars | 
|  | 181 | and methods, designed to allow a class's <tt>@interface</tt> to be | 
|  | 182 | split across multiple files; however, there is still a primary | 
|  | 183 | implementation file which must see the <tt>@interface</tt>s of all | 
|  | 184 | class extensions. | 
|  | 185 | <span class="term">Categories</span> allow methods (but not ivars) to | 
|  | 186 | be declared <i>post hoc</i> on an arbitrary class; the methods in the | 
|  | 187 | category's <tt>@implementation</tt> will be dynamically added to that | 
|  | 188 | class's method tables which the category is loaded at runtime, | 
|  | 189 | replacing those methods in case of a collision.</p> | 
|  | 190 |  | 
|  | 191 | <p>In the standard environment, objects are allocated on the heap, and | 
|  | 192 | their lifetime is manually managed using a reference count.  This is | 
|  | 193 | done using two instance methods which all classes are expected to | 
|  | 194 | implement: <tt>retain</tt> increases the object's reference count by | 
|  | 195 | 1, whereas <tt>release</tt> decreases it by 1 and calls the instance | 
|  | 196 | method <tt>dealloc</tt> if the count reaches 0.  To simplify certain | 
|  | 197 | operations, there is also an <span class="term">autorelease | 
|  | 198 | pool</span>, a thread-local list of objects to call <tt>release</tt> | 
|  | 199 | on later; an object can be added to this pool by | 
|  | 200 | calling <tt>autorelease</tt> on it.</p> | 
|  | 201 |  | 
|  | 202 | <p>Block pointers may be converted to type <tt>id</tt>; block objects | 
|  | 203 | are laid out in a way that makes them compatible with Objective-C | 
|  | 204 | objects.  There is a builtin class that all block objects are | 
|  | 205 | considered to be objects of; this class implements <tt>retain</tt> by | 
|  | 206 | adjusting the reference count, not by calling <tt>Block_copy</tt>.</p> | 
|  | 207 |  | 
|  | 208 | </div> <!-- meta.background --> | 
|  | 209 |  | 
|  | 210 | </div> <!-- meta --> | 
|  | 211 |  | 
|  | 212 | <div id="general"> | 
|  | 213 | <h1>General</h1> | 
|  | 214 |  | 
|  | 215 | <p>Automatic Reference Counting implements automatic memory management | 
|  | 216 | for Objective-C objects and blocks, freeing the programmer from the | 
|  | 217 | need explicitly insert retains and releases.  It does not provide a | 
|  | 218 | cycle collector; users must explicitly manage lifetime instead.</p> | 
|  | 219 |  | 
|  | 220 | <p>ARC may be explicitly enabled with the compiler | 
|  | 221 | flag <tt>-fobjc-arc</tt>.  It may also be explicitly disabled with the | 
|  | 222 | compiler flag <tt>-fno-objc-arc</tt>.  The last of these two flags | 
|  | 223 | appearing on the compile line <q>wins</q>.</p> | 
|  | 224 |  | 
|  | 225 | <p>If ARC is enabled, <tt>__has_feature(objc_arc)</tt> will expand to | 
|  | 226 | 1 in the preprocessor.  For more information about <tt>__has_feature</tt>, | 
|  | 227 | see the <a href="LanguageExtensions.html#__has_feature_extension">language | 
|  | 228 | extensions</a> document.</p> | 
|  | 229 |  | 
|  | 230 | </div> | 
|  | 231 |  | 
|  | 232 | <div id="objects"> | 
|  | 233 | <h1>Retainable object pointers</h1> | 
|  | 234 |  | 
|  | 235 | <p>This section describes retainable object pointers, their basic | 
|  | 236 | operations, and the restrictions imposed on their use under ARC.  Note | 
|  | 237 | in particular that it covers the rules for pointer <em>values</em> | 
|  | 238 | (patterns of bits indicating the location of a pointed-to object), not | 
|  | 239 | pointer | 
|  | 240 | <em>objects</em> (locations in memory which store pointer values). | 
|  | 241 | The rules for objects are covered in the next section.</p> | 
|  | 242 |  | 
|  | 243 | <p>A <span class="term">retainable object pointer</span> | 
|  | 244 | (or <q>retainable pointer</q>) is a value of | 
|  | 245 | a <span class="term">retainable object pointer type</span> | 
|  | 246 | (<q>retainable type</q>).  There are three kinds of retainable object | 
|  | 247 | pointer types:</p> | 
|  | 248 | <ul> | 
|  | 249 | <li>block pointers (formed by applying the caret (<tt>^</tt>) | 
|  | 250 | declarator sigil to a function type)</li> | 
|  | 251 | <li>Objective-C object pointers (<tt>id</tt>, <tt>Class</tt>, <tt>NSFoo*</tt>, etc.)</li> | 
|  | 252 | <li>typedefs marked with <tt>__attribute__((NSObject))</tt></li> | 
|  | 253 | </ul> | 
|  | 254 |  | 
|  | 255 | <p>Other pointer types, such as <tt>int*</tt> and <tt>CFStringRef</tt>, | 
|  | 256 | are not subject to ARC's semantics and restrictions.</p> | 
|  | 257 |  | 
|  | 258 | <div class="rationale"> | 
|  | 259 |  | 
|  | 260 | <p>Rationale: We are not at liberty to require | 
|  | 261 | all code to be recompiled with ARC; therefore, ARC must interoperate | 
|  | 262 | with Objective-C code which manages retains and releases manually.  In | 
|  | 263 | general, there are three requirements in order for a | 
|  | 264 | compiler-supported reference-count system to provide reliable | 
|  | 265 | interoperation:</p> | 
|  | 266 |  | 
|  | 267 | <ul> | 
|  | 268 | <li>The type system must reliably identify which objects are to be | 
|  | 269 | managed.  An <tt>int*</tt> might be a pointer to a <tt>malloc</tt>'ed | 
|  | 270 | array, or it might be a interior pointer to such an array, or it might | 
|  | 271 | point to some field or local variable.  In contrast, values of the | 
|  | 272 | retainable object pointer types are never interior.</li> | 
|  | 273 | <li>The type system must reliably indicate how to | 
|  | 274 | manage objects of a type.  This usually means that the type must imply | 
|  | 275 | a procedure for incrementing and decrementing retain counts. | 
|  | 276 | Supporting single-ownership objects requires a lot more explicit | 
|  | 277 | mediation in the language.</li> | 
|  | 278 | <li>There must be reliable conventions for whether and | 
|  | 279 | when <q>ownership</q> is passed between caller and callee, for both | 
|  | 280 | arguments and return values.  Objective-C methods follow such a | 
|  | 281 | convention very reliably, at least for system libraries on Mac OS X, | 
|  | 282 | and functions always pass objects at +0.  The C-based APIs for Core | 
|  | 283 | Foundation objects, on the other hand, have much more varied transfer | 
|  | 284 | semantics.</li> | 
|  | 285 | </ul> | 
|  | 286 | </div> <!-- rationale --> | 
|  | 287 |  | 
|  | 288 | <p>The use of <tt>__attribute__((NSObject))</tt> typedefs is not | 
|  | 289 | recommended.  If it's absolutely necessary to use this attribute, be | 
|  | 290 | very explicit about using the typedef, and do not assume that it will | 
|  | 291 | be preserved by language features like <tt>__typeof</tt> and C++ | 
|  | 292 | template argument substitution.</p> | 
|  | 293 |  | 
|  | 294 | <div class="rationale"><p>Rationale: any compiler operation which | 
|  | 295 | incidentally strips type <q>sugar</q> from a type will yield a type | 
|  | 296 | without the attribute, which may result in unexpected | 
|  | 297 | behavior.</p></div> | 
|  | 298 |  | 
|  | 299 | <div id="objects.retains"> | 
|  | 300 | <h1>Retain count semantics</h1> | 
|  | 301 |  | 
|  | 302 | <p>A retainable object pointer is either a <span class="term">null | 
|  | 303 | pointer</span> or a pointer to a valid object.  Furthermore, if it has | 
|  | 304 | block pointer type and is not <tt>null</tt> then it must actually be a | 
|  | 305 | pointer to a block object, and if it has <tt>Class</tt> type (possibly | 
|  | 306 | protocol-qualified) then it must actually be a pointer to a class | 
|  | 307 | object.  Otherwise ARC does not enforce the Objective-C type system as | 
|  | 308 | long as the implementing methods follow the signature of the static | 
|  | 309 | type.  It is undefined behavior if ARC is exposed to an invalid | 
|  | 310 | pointer.</p> | 
|  | 311 |  | 
|  | 312 | <p>For ARC's purposes, a valid object is one with <q>well-behaved</q> | 
|  | 313 | retaining operations.  Specifically, the object must be laid out such | 
|  | 314 | that the Objective-C message send machinery can successfully send it | 
|  | 315 | the following messages:</p> | 
|  | 316 |  | 
|  | 317 | <ul> | 
|  | 318 | <li><tt>retain</tt>, taking no arguments and returning a pointer to | 
|  | 319 | the object.</li> | 
|  | 320 | <li><tt>release</tt>, taking no arguments and returning <tt>void</tt>.</li> | 
|  | 321 | <li><tt>autorelease</tt>, taking no arguments and returning a pointer | 
|  | 322 | to the object.</li> | 
|  | 323 | </ul> | 
|  | 324 |  | 
|  | 325 | <p>The behavior of these methods is constrained in the following ways. | 
|  | 326 | The term <span class="term">high-level semantics</span> is an | 
|  | 327 | intentionally vague term; the intent is that programmers must | 
|  | 328 | implement these methods in a way such that the compiler, modifying | 
|  | 329 | code in ways it deems safe according to these constraints, will not | 
|  | 330 | violate their requirements.  For example, if the user puts logging | 
|  | 331 | statements in <tt>retain</tt>, they should not be surprised if those | 
|  | 332 | statements are executed more or less often depending on optimization | 
|  | 333 | settings.  These constraints are not exhaustive of the optimization | 
|  | 334 | opportunities: values held in local variables are subject to | 
|  | 335 | additional restrictions, described later in this document.</p> | 
|  | 336 |  | 
|  | 337 | <p>It is undefined behavior if a computation history featuring a send | 
|  | 338 | of <tt>retain</tt> followed by a send of <tt>release</tt> to the same | 
|  | 339 | object, with no intervening <tt>release</tt> on that object, is not | 
|  | 340 | equivalent under the high-level semantics to a computation | 
|  | 341 | history in which these sends are removed.  Note that this implies that | 
|  | 342 | these methods may not raise exceptions.</p> | 
|  | 343 |  | 
|  | 344 | <p>It is undefined behavior if a computation history features any use | 
|  | 345 | whatsoever of an object following the completion of a send | 
|  | 346 | of <tt>release</tt> that is not preceded by a send of <tt>retain</tt> | 
|  | 347 | to the same object.</p> | 
|  | 348 |  | 
|  | 349 | <p>The behavior of <tt>autorelease</tt> must be equivalent to sending | 
|  | 350 | <tt>release</tt> when one of the autorelease pools currently in scope | 
|  | 351 | is popped.  It may not throw an exception.</p> | 
|  | 352 |  | 
|  | 353 | <p>When the semantics call for performing one of these operations on a | 
|  | 354 | retainable object pointer, if that pointer is <tt>null</tt> then the | 
|  | 355 | effect is a no-op.</p> | 
|  | 356 |  | 
|  | 357 | <p>All of the semantics described in this document are subject to | 
|  | 358 | additional <a href="#optimization">optimization rules</a> which permit | 
|  | 359 | the removal or optimization of operations based on local knowledge of | 
|  | 360 | data flow.  The semantics describe the high-level behaviors that the | 
|  | 361 | compiler implements, not an exact sequence of operations that a | 
|  | 362 | program will be compiled into.</p> | 
|  | 363 |  | 
|  | 364 | </div> <!-- objects.retains --> | 
|  | 365 |  | 
|  | 366 | <div id="objects.operands"> | 
|  | 367 | <h1>Retainable object pointers as operands and arguments</h1> | 
|  | 368 |  | 
|  | 369 | <p>In general, ARC does not perform retain or release operations when | 
|  | 370 | simply using a retainable object pointer as an operand within an | 
|  | 371 | expression.  This includes:</p> | 
|  | 372 | <ul> | 
|  | 373 | <li>loading a retainable pointer from an object with non-weak | 
|  | 374 | <a href="#ownership">ownership</a>,</li> | 
|  | 375 | <li>passing a retainable pointer as an argument to a function or | 
|  | 376 | method, and</li> | 
|  | 377 | <li>receiving a retainable pointer as the result of a function or | 
|  | 378 | method call.</li> | 
|  | 379 | </ul> | 
|  | 380 |  | 
|  | 381 | <div class="rationale"><p>Rationale: while this might seem | 
|  | 382 | uncontroversial, it is actually unsafe when multiple expressions are | 
|  | 383 | evaluated in <q>parallel</q>, as with binary operators and calls, | 
|  | 384 | because (for example) one expression might load from an object while | 
|  | 385 | another writes to it.  However, C and C++ already call this undefined | 
|  | 386 | behavior because the evaluations are unsequenced, and ARC simply | 
|  | 387 | exploits that here to avoid needing to retain arguments across a large | 
|  | 388 | number of calls.</p></div> | 
|  | 389 |  | 
|  | 390 | <p>The remainder of this section describes exceptions to these rules, | 
|  | 391 | how those exceptions are detected, and what those exceptions imply | 
|  | 392 | semantically.</p> | 
|  | 393 |  | 
|  | 394 | <div id="objects.operands.consumed"> | 
|  | 395 | <h1>Consumed parameters</h1> | 
|  | 396 |  | 
|  | 397 | <p>A function or method parameter of retainable object pointer type | 
|  | 398 | may be marked as <span class="term">consumed</span>, signifying that | 
|  | 399 | the callee expects to take ownership of a +1 retain count.  This is | 
|  | 400 | done by adding the <tt>ns_consumed</tt> attribute to the parameter | 
|  | 401 | declaration, like so:</p> | 
|  | 402 |  | 
|  | 403 | <pre>void foo(__attribute((ns_consumed)) id x); | 
|  | 404 | - (void) foo: (id) __attribute((ns_consumed)) x;</pre> | 
|  | 405 |  | 
|  | 406 | <p>This attribute is part of the type of the function or method, not | 
|  | 407 | the type of the parameter.  It controls only how the argument is | 
|  | 408 | passed and received.</p> | 
|  | 409 |  | 
|  | 410 | <p>When passing such an argument, ARC retains the argument prior to | 
|  | 411 | making the call.</p> | 
|  | 412 |  | 
|  | 413 | <p>When receiving such an argument, ARC releases the argument at the | 
|  | 414 | end of the function, subject to the usual optimizations for local | 
|  | 415 | values.</p> | 
|  | 416 |  | 
|  | 417 | <div class="rationale"><p>Rationale: this formalizes direct transfers | 
|  | 418 | of ownership from a caller to a callee.  The most common scenario here | 
|  | 419 | is passing the <tt>self</tt> parameter to <tt>init</tt>, but it is | 
|  | 420 | useful to generalize.  Typically, local optimization will remove any | 
|  | 421 | extra retains and releases: on the caller side the retain will be | 
|  | 422 | merged with a +1 source, and on the callee side the release will be | 
|  | 423 | rolled into the initialization of the parameter.</p></div> | 
|  | 424 |  | 
|  | 425 | <p>The implicit <tt>self</tt> parameter of a method may be marked as | 
|  | 426 | consumed by adding <tt>__attribute__((ns_consumes_self))</tt> to the | 
| John McCall | be16b89 | 2011-06-18 08:15:19 +0000 | [diff] [blame] | 427 | method declaration.  Methods in the <tt>init</tt> | 
|  | 428 | <a href="#family">family</a> are treated as if they were implicitly | 
|  | 429 | marked with this attribute.</p> | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 430 |  | 
| John McCall | be16b89 | 2011-06-18 08:15:19 +0000 | [diff] [blame] | 431 | <p>It is undefined behavior if an Objective-C message send to a method | 
|  | 432 | with <tt>ns_consumed</tt> parameters (other than self) is made with a | 
|  | 433 | null receiver.  It is undefined behavior if the method to which an | 
|  | 434 | Objective-C message send statically resolves to has a different set | 
|  | 435 | of <tt>ns_consumed</tt> parameters than the method it dynamically | 
|  | 436 | resolves to.  It is undefined behavior if a block or function call is | 
|  | 437 | made through a static type with a different set of <tt>ns_consumed</tt> | 
|  | 438 | parameters than the implementation of the called block or function.</p> | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 439 |  | 
| John McCall | be16b89 | 2011-06-18 08:15:19 +0000 | [diff] [blame] | 440 | <div class="rationale"><p>Rationale: consumed parameters with null | 
|  | 441 | receiver are a guaranteed leak.  Mismatches with consumed parameters | 
|  | 442 | will cause over-retains or over-releases, depending on the direction. | 
|  | 443 | The rule about function calls is really just an application of the | 
|  | 444 | existing C/C++ rule about calling functions through an incompatible | 
|  | 445 | function type, but it's useful to state it explicitly.</p></div> | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 446 |  | 
|  | 447 | </div> | 
|  | 448 |  | 
| John McCall | be16b89 | 2011-06-18 08:15:19 +0000 | [diff] [blame] | 449 | <div id="objects.operands.retained_returns"> | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 450 | <h1>Retained return values</h1> | 
|  | 451 |  | 
|  | 452 | <p>A function or method which returns a retainable object pointer type | 
|  | 453 | may be marked as returning a retained value, signifying that the | 
|  | 454 | caller expects to take ownership of a +1 retain count.  This is done | 
|  | 455 | by adding the <tt>ns_returns_retained</tt> attribute to the function or | 
|  | 456 | method declaration, like so:</p> | 
|  | 457 |  | 
|  | 458 | <pre>id foo(void) __attribute((ns_returns_retained)); | 
|  | 459 | - (id) foo __attribute((ns_returns_retained));</pre> | 
|  | 460 |  | 
|  | 461 | <p>This attribute is part of the type of the function or method.</p> | 
|  | 462 |  | 
|  | 463 | <p>When returning from such a function or method, ARC retains the | 
|  | 464 | value at the point of evaluation of the return statement, before | 
|  | 465 | leaving all local scopes.</p> | 
|  | 466 |  | 
|  | 467 | <p>When receiving a return result from such a function or method, ARC | 
|  | 468 | releases the value at the end of the full-expression it is contained | 
|  | 469 | within, subject to the usual optimizations for local values.</p> | 
|  | 470 |  | 
|  | 471 | <div class="rationale"><p>Rationale: this formalizes direct transfers of | 
|  | 472 | ownership from a callee to a caller.  The most common scenario this | 
|  | 473 | models is the retained return from <tt>init</tt>, <tt>alloc</tt>, | 
|  | 474 | <tt>new</tt>, and <tt>copy</tt> methods, but there are other cases in | 
|  | 475 | the frameworks.  After optimization there are typically no extra | 
|  | 476 | retains and releases required.</p></div> | 
|  | 477 |  | 
|  | 478 | <p>Methods in | 
|  | 479 | the <tt>alloc</tt>, <tt>copy</tt>, <tt>init</tt>, <tt>mutableCopy</tt>, | 
|  | 480 | and <tt>new</tt> <a href="#family">families</a> are implicitly marked | 
|  | 481 | <tt>__attribute__((ns_returns_retained))</tt>.  This may be suppressed | 
|  | 482 | by explicitly marking the | 
|  | 483 | method <tt>__attribute__((ns_returns_not_retained))</tt>.</p> | 
|  | 484 | </div> | 
|  | 485 |  | 
| John McCall | be16b89 | 2011-06-18 08:15:19 +0000 | [diff] [blame] | 486 | <p>It is undefined behavior if the method to which an Objective-C | 
|  | 487 | message send statically resolves has different retain semantics on its | 
|  | 488 | result from the method it dynamically resolves to.  It is undefined | 
|  | 489 | behavior if a block or function call is made through a static type | 
|  | 490 | with different retain semantics on its result from the implementation | 
|  | 491 | of the called block or function.</p> | 
|  | 492 |  | 
|  | 493 | <div class="rationale"><p>Rationale: Mismatches with returned results | 
|  | 494 | will cause over-retains or over-releases, depending on the direction. | 
|  | 495 | Again, the rule about function calls is really just an application of | 
|  | 496 | the existing C/C++ rule about calling functions through an | 
|  | 497 | incompatible function type.</p></div> | 
|  | 498 |  | 
|  | 499 |  | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 500 | <div id="objects.operands.other-returns"> | 
|  | 501 | <h1>Unretained return values</h1> | 
|  | 502 |  | 
|  | 503 | <p>A method or function which returns a retainable object type but | 
|  | 504 | does not return a retained value must ensure that the object is | 
|  | 505 | still valid across the return boundary.</p> | 
|  | 506 |  | 
|  | 507 | <p>When returning from such a function or method, ARC retains the | 
|  | 508 | value at the point of evaluation of the return statement, then leaves | 
|  | 509 | all local scopes, and then balances out the retain while ensuring that | 
|  | 510 | the value lives across the call boundary.  In the worst case, this may | 
|  | 511 | involve an <tt>autorelease</tt>, but callers must not assume that the | 
|  | 512 | value is actually in the autorelease pool.</p> | 
|  | 513 |  | 
|  | 514 | <p>ARC performs no extra mandatory work on the caller side, although | 
|  | 515 | it may elect to do something to shorten the lifetime of the returned | 
|  | 516 | value.</p> | 
|  | 517 |  | 
|  | 518 | <div class="rationale"><p>Rationale: it is common in non-ARC code to not | 
|  | 519 | return an autoreleased value; therefore the convention does not force | 
|  | 520 | either path.  It is convenient to not be required to do unnecessary | 
|  | 521 | retains and autoreleases; this permits optimizations such as eliding | 
|  | 522 | retain/autoreleases when it can be shown that the original pointer | 
|  | 523 | will still be valid at the point of return.</p></div> | 
|  | 524 |  | 
|  | 525 | <p>A method or function may be marked | 
|  | 526 | with <tt>__attribute__((ns_returns_autoreleased))</tt> to indicate | 
|  | 527 | that it returns a pointer which is guaranteed to be valid at least as | 
|  | 528 | long as the innermost autorelease pool.  There are no additional | 
|  | 529 | semantics enforced in the definition of such a method; it merely | 
|  | 530 | enables optimizations in callers.</p> | 
|  | 531 | </div> | 
|  | 532 |  | 
|  | 533 | <div id="objects.operands.casts"> | 
|  | 534 | <h1>Bridged casts</h1> | 
|  | 535 |  | 
|  | 536 | <p>A <span class="term">bridged cast</span> is a C-style cast | 
|  | 537 | annotated with one of three keywords:</p> | 
|  | 538 |  | 
|  | 539 | <ul> | 
|  | 540 | <li><tt>(__bridge T) op</tt> casts the operand to the destination | 
|  | 541 | type <tt>T</tt>.  If <tt>T</tt> is a retainable object pointer type, | 
|  | 542 | then <tt>op</tt> must have a non-retainable pointer type. | 
|  | 543 | If <tt>T</tt> is a non-retainable pointer type, then <tt>op</tt> must | 
|  | 544 | have a retainable object pointer type.  Otherwise the cast is | 
|  | 545 | ill-formed.  There is no transfer of ownership, and ARC inserts | 
|  | 546 | no retain operations.</li> | 
|  | 547 |  | 
|  | 548 | <li><tt>(__bridge_retained T) op</tt> casts the operand, which must | 
|  | 549 | have retainable object pointer type, to the destination type, which | 
|  | 550 | must be a non-retainable pointer type.  ARC retains the value, subject | 
|  | 551 | to the usual optimizations on local values, and the recipient is | 
|  | 552 | responsible for balancing that +1.</li> | 
|  | 553 |  | 
|  | 554 | <li><tt>(__bridge_transfer T) op</tt> casts the operand, which must | 
|  | 555 | have non-retainable pointer type, to the destination type, which must | 
|  | 556 | be a retainable object pointer type.  ARC will release the value at | 
|  | 557 | the end of the enclosing full-expression, subject to the usual | 
|  | 558 | optimizations on local values.</li> | 
|  | 559 | </ul> | 
|  | 560 |  | 
|  | 561 | <p>These casts are required in order to transfer objects in and out of | 
|  | 562 | ARC control; see the rationale in the section | 
|  | 563 | on <a href="#objects.restrictions.conversion">conversion of retainable | 
|  | 564 | object pointers</a>.</p> | 
|  | 565 |  | 
|  | 566 | <p>Using a <tt>__bridge_retained</tt> or <tt>__bridge_transfer</tt> | 
|  | 567 | cast purely to convince ARC to emit an unbalanced retain or release, | 
|  | 568 | respectively, is poor form.</p> | 
|  | 569 |  | 
|  | 570 | </div> | 
|  | 571 |  | 
|  | 572 | </div> | 
|  | 573 |  | 
|  | 574 | <div id="objects.restrictions"> | 
|  | 575 | <h1>Restrictions</h1> | 
|  | 576 |  | 
|  | 577 | <div id="objects.restrictions.conversion"> | 
|  | 578 | <h1>Conversion of retainable object pointers</h1> | 
|  | 579 |  | 
|  | 580 | <p>In general, a program which attempts to implicitly or explicitly | 
|  | 581 | convert a value of retainable object pointer type to any | 
|  | 582 | non-retainable type, or vice-versa, is ill-formed.  For example, an | 
| Fariborz Jahanian | a26b2e5 | 2011-07-06 21:58:44 +0000 | [diff] [blame] | 583 | Objective-C object pointer shall not be converted to <tt>void*</tt>. | 
|  | 584 | As an exception, cast to <tt>intptr_t</tt> is allowed becuase such | 
|  | 585 | casts are not transferring ownership. The <a href="#objects.operands.casts">bridged | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 586 | casts</a> may be used to perform these conversions where | 
|  | 587 | necessary.</p> | 
|  | 588 |  | 
|  | 589 | <div class="rationale"><p>Rationale: we cannot ensure the correct | 
|  | 590 | management of the lifetime of objects if they may be freely passed | 
|  | 591 | around as unmanaged types.  The bridged casts are provided so that the | 
|  | 592 | programmer may explicitly describe whether the cast transfers control | 
|  | 593 | into or out of ARC.</p></div> | 
|  | 594 | </div> | 
|  | 595 |  | 
|  | 596 | <p>An unbridged cast to a retainable object pointer type of the return | 
|  | 597 | value of a Objective-C message send which yields a non-retainable | 
|  | 598 | pointer is treated as a <tt>__bridge_transfer</tt> cast | 
|  | 599 | if:</p> | 
|  | 600 |  | 
|  | 601 | <ul> | 
|  | 602 | <li>the method has the <tt>cf_returns_retained</tt> attribute, or if | 
|  | 603 | not that,</li> | 
|  | 604 | <li>the method does not have the <tt>cf_returns_not_retained</tt> | 
|  | 605 | attribute and</li> | 
|  | 606 | <li>the method's <a href="#family">selector family</a> would imply | 
|  | 607 | the <tt>ns_returns_retained</tt> attribute on a method which returned | 
|  | 608 | a retainable object pointer type.</li> | 
|  | 609 | </ul> | 
|  | 610 |  | 
|  | 611 | <p>Otherwise the cast is treated as a <tt>__bridge</tt> cast.</p> | 
|  | 612 |  | 
|  | 613 | </div> | 
|  | 614 |  | 
|  | 615 | </div> | 
|  | 616 |  | 
|  | 617 | <div id="ownership"> | 
|  | 618 | <h1>Ownership qualification</h1> | 
|  | 619 |  | 
|  | 620 | <p>This section describes the behavior of <em>objects</em> of | 
|  | 621 | retainable object pointer type; that is, locations in memory which | 
|  | 622 | store retainable object pointers.</p> | 
|  | 623 |  | 
|  | 624 | <p>A type is a <span class="term">retainable object owner type</span> | 
|  | 625 | if it is a retainable object pointer type or an array type whose | 
|  | 626 | element type is a retainable object owner type.</p> | 
|  | 627 |  | 
|  | 628 | <p>An <span class="term">ownership qualifier</span> is a type | 
| Douglas Gregor | 4020cae | 2011-06-17 23:16:24 +0000 | [diff] [blame] | 629 | qualifier which applies only to retainable object owner types. An array type is | 
|  | 630 | ownership-qualified according to its element type, and adding an ownership | 
|  | 631 | qualifier to an array type so qualifies its element type.</p> | 
|  | 632 |  | 
|  | 633 | <p>A program is ill-formed if it attempts to apply an ownership qualifier | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 634 | to a type which is already ownership-qualified, even if it is the same | 
| Douglas Gregor | 4020cae | 2011-06-17 23:16:24 +0000 | [diff] [blame] | 635 | qualifier. There is a single exception to this rule: an ownership qualifier | 
|  | 636 | may be applied to a substituted template type parameter, which overrides the | 
|  | 637 | ownership qualifier provided by the template argument.</p> | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 638 |  | 
|  | 639 | <p>Except as described under | 
|  | 640 | the <a href="#ownership.inference">inference rules</a>, a program is | 
|  | 641 | ill-formed if it attempts to form a pointer or reference type to a | 
|  | 642 | retainable object owner type which lacks an ownership qualifier.</p> | 
|  | 643 |  | 
|  | 644 | <div class="rationale"><p>Rationale: these rules, together with the | 
|  | 645 | inference rules, ensure that all objects and lvalues of retainable | 
| Douglas Gregor | 4020cae | 2011-06-17 23:16:24 +0000 | [diff] [blame] | 646 | object pointer type have an ownership qualifier. The ability to override an ownership qualifier during template substitution is required to counteract the <a href="#ownership.inference.template_arguments">inference of <tt>__strong</tt> for template type arguments</a>. </p></div> | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 647 |  | 
|  | 648 | <p>There are four ownership qualifiers:</p> | 
|  | 649 |  | 
|  | 650 | <ul> | 
|  | 651 | <li><tt>__autoreleasing</tt></li> | 
|  | 652 | <li><tt>__strong</tt></li> | 
|  | 653 | <li><tt>__unsafe_unretained</tt></li> | 
|  | 654 | <li><tt>__weak</tt></li> | 
|  | 655 | </ul> | 
|  | 656 |  | 
|  | 657 | <p>A type is <span class="term">nontrivially ownership-qualified</span> | 
|  | 658 | if it is qualified with <tt>__autoreleasing</tt>, <tt>__strong</tt>, or | 
|  | 659 | <tt>__weak</tt>.</p> | 
|  | 660 |  | 
|  | 661 | <div id="ownership.spelling"> | 
|  | 662 | <h1>Spelling</h1> | 
|  | 663 |  | 
|  | 664 | <p>The names of the ownership qualifiers are reserved for the | 
|  | 665 | implementation.  A program may not assume that they are or are not | 
|  | 666 | implemented with macros, or what those macros expand to.</p> | 
|  | 667 |  | 
|  | 668 | <p>An ownership qualifier may be written anywhere that any other type | 
|  | 669 | qualifier may be written.</p> | 
|  | 670 |  | 
|  | 671 | <p>If an ownership qualifier appears in | 
|  | 672 | the <i>declaration-specifiers</i>, the following rules apply:</p> | 
|  | 673 |  | 
|  | 674 | <ul> | 
|  | 675 | <li>if the type specifier is a retainable object owner type, the | 
|  | 676 | qualifier applies to that type;</li> | 
|  | 677 | <li>if the outermost non-array part of the declarator is a pointer or | 
|  | 678 | block pointer, the qualifier applies to that type;</li> | 
|  | 679 | <li>otherwise the program is ill-formed.</li> | 
|  | 680 | </ul> | 
|  | 681 |  | 
|  | 682 | <p>If an ownership qualifier appears on the declarator name, or on the | 
|  | 683 | declared object, it is applied to outermost pointer or block-pointer | 
|  | 684 | type.</p> | 
|  | 685 |  | 
|  | 686 | <p>If an ownership qualifier appears anywhere else in a declarator, it | 
|  | 687 | applies to the type there.</p> | 
|  | 688 |  | 
|  | 689 | </div> <!-- ownership.spelling --> | 
|  | 690 |  | 
|  | 691 | <div id="ownership.semantics"> | 
|  | 692 | <h1>Semantics</h1> | 
|  | 693 |  | 
|  | 694 | <p>There are five <span class="term">managed operations</span> which | 
|  | 695 | may be performed on an object of retainable object pointer type.  Each | 
|  | 696 | qualifier specifies different semantics for each of these operations. | 
|  | 697 | It is still undefined behavior to access an object outside of its | 
|  | 698 | lifetime.</p> | 
|  | 699 |  | 
|  | 700 | <p>A load or store with <q>primitive semantics</q> has the same | 
|  | 701 | semantics as the respective operation would have on an <tt>void*</tt> | 
|  | 702 | lvalue with the same alignment and non-ownership qualification.</p> | 
|  | 703 |  | 
|  | 704 | <p><span class="term">Reading</span> occurs when performing a | 
|  | 705 | lvalue-to-rvalue conversion on an object lvalue. | 
|  | 706 |  | 
|  | 707 | <ul> | 
|  | 708 | <li>For <tt>__weak</tt> objects, the current pointee is retained and | 
|  | 709 | then released at the end of the current full-expression.  This must | 
|  | 710 | execute atomically with respect to assignments and to the final | 
|  | 711 | release of the pointee.</li> | 
|  | 712 | <li>For all other objects, the lvalue is loaded with primitive | 
|  | 713 | semantics.</li> | 
|  | 714 | </ul> | 
|  | 715 | </p> | 
|  | 716 |  | 
|  | 717 | <p><span class="term">Assignment</span> occurs when evaluating | 
|  | 718 | an assignment operator.  The semantics vary based on the qualification: | 
|  | 719 | <ul> | 
|  | 720 | <li>For <tt>__strong</tt> objects, the new pointee is first retained; | 
|  | 721 | second, the lvalue is loaded with primitive semantics; third, the new | 
|  | 722 | pointee is stored into the lvalue with primitive semantics; and | 
|  | 723 | finally, the old pointee is released.  This is not performed | 
|  | 724 | atomically; external synchronization must be used to make this safe in | 
|  | 725 | the face of concurrent loads and stores.</li> | 
|  | 726 | <li>For <tt>__weak</tt> objects, the lvalue is updated to point to the | 
|  | 727 | new pointee, unless that object is currently undergoing deallocation, | 
|  | 728 | in which case it the lvalue is updated to a null pointer.  This must | 
|  | 729 | execute atomically with respect to other assignments to the object, to | 
|  | 730 | reads from the object, and to the final release of the new pointed-to | 
|  | 731 | value.</li> | 
|  | 732 | <li>For <tt>__unsafe_unretained</tt> objects, the new pointee is | 
|  | 733 | stored into the lvalue using primitive semantics.</li> | 
|  | 734 | <li>For <tt>__autoreleasing</tt> objects, the new pointee is retained, | 
|  | 735 | autoreleased, and stored into the lvalue using primitive semantics.</li> | 
|  | 736 | </ul> | 
|  | 737 | </p> | 
|  | 738 |  | 
|  | 739 | <p><span class="term">Initialization</span> occurs when an object's | 
|  | 740 | lifetime begins, which depends on its storage duration. | 
|  | 741 | Initialization proceeds in two stages: | 
|  | 742 | <ol> | 
|  | 743 | <li>First, a null pointer is stored into the lvalue using primitive | 
|  | 744 | semantics.  This step is skipped if the object | 
|  | 745 | is <tt>__unsafe_unretained</tt>.</li> | 
|  | 746 | <li>Second, if the object has an initializer, that expression is | 
|  | 747 | evaluated and then assigned into the object using the usual assignment | 
|  | 748 | semantics.</li> | 
|  | 749 | </ol> | 
|  | 750 | </p> | 
|  | 751 |  | 
|  | 752 | <p><span class="term">Destruction</span> occurs when an object's | 
|  | 753 | lifetime ends.  In all cases it is semantically equivalent to | 
|  | 754 | assigning a null pointer to the object, with the proviso that of | 
|  | 755 | course the object cannot be legally read after the object's lifetime | 
|  | 756 | ends.</p> | 
|  | 757 |  | 
|  | 758 | <p><span class="term">Moving</span> occurs in specific situations | 
|  | 759 | where an lvalue is <q>moved from</q>, meaning that its current pointee | 
|  | 760 | will be used but the object may be left in a different (but still | 
|  | 761 | valid) state.  This arises with <tt>__block</tt> variables and rvalue | 
|  | 762 | references in C++. For <tt>__strong</tt> lvalues, moving is equivalent | 
|  | 763 | to loading the lvalue with primitive semantics, writing a null pointer | 
|  | 764 | to it with primitive semantics, and then releasing the result of the | 
|  | 765 | load at the end of the current full-expression.  For all other | 
|  | 766 | lvalues, moving is equivalent to reading the object.</p> | 
|  | 767 |  | 
|  | 768 | </div> <!-- ownership.semantics --> | 
|  | 769 |  | 
|  | 770 | <div id="ownership.restrictions"> | 
|  | 771 | <h1>Restrictions</h1> | 
|  | 772 |  | 
|  | 773 | <div id="ownership.restrictions.autoreleasing"> | 
|  | 774 | <h1>Storage duration of<tt> __autoreleasing</tt> objects</h1> | 
|  | 775 |  | 
|  | 776 | <p>A program is ill-formed if it declares an <tt>__autoreleasing</tt> | 
|  | 777 | object of non-automatic storage duration.</p> | 
|  | 778 |  | 
|  | 779 | <div class="rationale"><p>Rationale: autorelease pools are tied to the | 
|  | 780 | current thread and scope by their nature.  While it is possible to | 
|  | 781 | have temporary objects whose instance variables are filled with | 
|  | 782 | autoreleased objects, there is no way that ARC can provide any sort of | 
|  | 783 | safety guarantee there.</p></div> | 
|  | 784 |  | 
|  | 785 | <p>It is undefined behavior if a non-null pointer is assigned to | 
|  | 786 | an <tt>__autoreleasing</tt> object while an autorelease pool is in | 
|  | 787 | scope and then that object is read after the autorelease pool's scope | 
|  | 788 | is left.</p> | 
|  | 789 |  | 
|  | 790 | </div> | 
|  | 791 |  | 
|  | 792 | <div id="ownership.restrictions.conversion.indirect"> | 
|  | 793 | <h1>Conversion of pointers to ownership-qualified types</h1> | 
|  | 794 |  | 
|  | 795 | <p>A program is ill-formed if an expression of type <tt>T*</tt> is | 
|  | 796 | converted, explicitly or implicitly, to the type <tt>U*</tt>, | 
|  | 797 | where <tt>T</tt> and <tt>U</tt> have different ownership | 
|  | 798 | qualification, unless: | 
|  | 799 | <ul> | 
|  | 800 | <li><tt>T</tt> is qualified with <tt>__strong</tt>, | 
|  | 801 | <tt>__autoreleasing</tt>, or <tt>__unsafe_unretained</tt>, and | 
|  | 802 | <tt>U</tt> is qualified with both <tt>const</tt> and | 
|  | 803 | <tt>__unsafe_unretained</tt>; or</li> | 
|  | 804 | <li>either <tt>T</tt> or <tt>U</tt> is <tt>cv void</tt>, where | 
|  | 805 | <tt>cv</tt> is an optional sequence of non-ownership qualifiers; or</li> | 
|  | 806 | <li>the conversion is requested with a <tt>reinterpret_cast</tt> in | 
|  | 807 | Objective-C++; or</li> | 
|  | 808 | <li>the conversion is a | 
|  | 809 | well-formed <a href="#ownership.restrictions.pass_by_writeback">pass-by-writeback</a>.</li> | 
|  | 810 | </ul> | 
|  | 811 | </p> | 
|  | 812 |  | 
|  | 813 | <p>The analogous rule applies to <tt>T&</tt> and <tt>U&</tt> in | 
|  | 814 | Objective-C++.</p> | 
|  | 815 |  | 
|  | 816 | <div class="rationale"><p>Rationale: these rules provide a reasonable | 
|  | 817 | level of type-safety for indirect pointers, as long as the underlying | 
|  | 818 | memory is not deallocated.  The conversion to <tt>const | 
|  | 819 | __unsafe_unretained</tt> is permitted because the semantics of reads | 
|  | 820 | are equivalent across all these ownership semantics, and that's a very | 
|  | 821 | useful and common pattern.  The interconversion with <tt>void*</tt> is | 
|  | 822 | useful for allocating memory or otherwise escaping the type system, | 
|  | 823 | but use it carefully.  <tt>reinterpret_cast</tt> is considered to be | 
|  | 824 | an obvious enough sign of taking responsibility for any | 
|  | 825 | problems.</p></div> | 
|  | 826 |  | 
|  | 827 | <p>It is undefined behavior to access an ownership-qualified object | 
|  | 828 | through an lvalue of a differently-qualified type, except that any | 
|  | 829 | non-<tt>__weak</tt> object may be read through | 
|  | 830 | an <tt>__unsafe_unretained</tt> lvalue.</p> | 
|  | 831 |  | 
|  | 832 | <p>It is undefined behavior if a managed operation is performed on | 
|  | 833 | a <tt>__strong</tt> or <tt>__weak</tt> object without a guarantee that | 
|  | 834 | it contains a primitive zero bit-pattern, or if the storage for such | 
|  | 835 | an object is freed or reused without the object being first assigned a | 
|  | 836 | null pointer.</p> | 
|  | 837 |  | 
|  | 838 | <div class="rationale"><p>Rationale: ARC cannot differentiate between | 
|  | 839 | an assignment operator which is intended to <q>initialize</q> dynamic | 
|  | 840 | memory and one which is intended to potentially replace a value. | 
|  | 841 | Therefore the object's pointer must be valid before letting ARC at it. | 
|  | 842 | Similarly, C and Objective-C do not provide any language hooks for | 
|  | 843 | destroying objects held in dynamic memory, so it is the programmer's | 
|  | 844 | responsibility to avoid leaks (<tt>__strong</tt> objects) and | 
|  | 845 | consistency errors (<tt>__weak</tt> objects).</p> | 
|  | 846 |  | 
|  | 847 | <p>These requirements are followed automatically in Objective-C++ when | 
|  | 848 | creating objects of retainable object owner type with <tt>new</tt> | 
|  | 849 | or <tt>new[]</tt> and destroying them with <tt>delete</tt>, | 
|  | 850 | <tt>delete[]</tt>, or a pseudo-destructor expression.  Note that | 
|  | 851 | arrays of nontrivially-ownership-qualified type are not ABI compatible | 
|  | 852 | with non-ARC code because the element type is non-POD: such arrays | 
|  | 853 | that are <tt>new[]</tt>'d in ARC translation units cannot | 
|  | 854 | be <tt>delete[]</tt>'d in non-ARC translation units and | 
|  | 855 | vice-versa.</p></div> | 
|  | 856 |  | 
|  | 857 | </div> | 
|  | 858 |  | 
|  | 859 | <div id="ownership.restrictions.pass_by_writeback"> | 
|  | 860 | <h1>Passing to an out parameter by writeback</h1> | 
|  | 861 |  | 
|  | 862 | <p>If the argument passed to a parameter of type | 
|  | 863 | <tt>T __autoreleasing *</tt> has type <tt>U oq *</tt>, | 
|  | 864 | where <tt>oq</tt> is an ownership qualifier, then the argument is a | 
|  | 865 | candidate for <span class="term">pass-by-writeback</span> if:</p> | 
|  | 866 |  | 
|  | 867 | <ul> | 
|  | 868 | <li><tt>oq</tt> is <tt>__strong</tt> or <tt>__weak</tt>, and | 
|  | 869 | <li>it would be legal to initialize a <tt>T __strong *</tt> with | 
|  | 870 | a <tt>U __strong *</tt>.</li> | 
|  | 871 | </ul> | 
|  | 872 |  | 
|  | 873 | <p>For purposes of overload resolution, an implicit conversion | 
|  | 874 | sequence requiring a pass-by-writeback is always worse than an | 
|  | 875 | implicit conversion sequence not requiring a pass-by-writeback.</p> | 
|  | 876 |  | 
|  | 877 | <p>The pass-by-writeback is ill-formed if the argument expression does | 
|  | 878 | not have a legal form:</p> | 
|  | 879 |  | 
|  | 880 | <ul> | 
|  | 881 | <li><tt>&var</tt>, where <tt>var</tt> is a scalar variable of | 
|  | 882 | automatic storage duration with retainable object pointer type</li> | 
|  | 883 | <li>a conditional expression where the second and third operands are | 
|  | 884 | both legal forms</li> | 
|  | 885 | <li>a cast whose operand is a legal form</li> | 
|  | 886 | <li>a null pointer constant</li> | 
|  | 887 | </ul> | 
|  | 888 |  | 
|  | 889 | <div class="rationale"><p>Rationale: the restriction in the form of | 
|  | 890 | the argument serves two purposes.  First, it makes it impossible to | 
|  | 891 | pass the address of an array to the argument, which serves to protect | 
|  | 892 | against an otherwise serious risk of mis-inferring an <q>array</q> | 
|  | 893 | argument as an out-parameter.  Second, it makes it much less likely | 
|  | 894 | that the user will see confusing aliasing problems due to the | 
|  | 895 | implementation, below, where their store to the writeback temporary is | 
|  | 896 | not immediately seen in the original argument variable.</p></div> | 
|  | 897 |  | 
|  | 898 | <p>A pass-by-writeback is evaluated as follows: | 
|  | 899 | <ol> | 
|  | 900 | <li>The argument is evaluated to yield a pointer <tt>p</tt> of | 
|  | 901 | type <tt>U oq *</tt>.</li> | 
|  | 902 | <li>If <tt>p</tt> is a null pointer, then a null pointer is passed as | 
|  | 903 | the argument, and no further work is required for the pass-by-writeback.</li> | 
|  | 904 | <li>Otherwise, a temporary of type <tt>T __autoreleasing</tt> is | 
|  | 905 | created and initialized to a null pointer.</li> | 
|  | 906 | <li>If the argument is not an Objective-C method parameter marked | 
|  | 907 | <tt>out</tt>, then <tt>*p</tt> is read, and the result is written | 
|  | 908 | into the temporary with primitive semantics.</li> | 
|  | 909 | <li>The address of the temporary is passed as the argument to the | 
|  | 910 | actual call.</li> | 
|  | 911 | <li>After the call completes, the temporary is loaded with primitive | 
|  | 912 | semantics, and that value is assigned into <tt>*p</tt>.</li> | 
|  | 913 | </ol></p> | 
|  | 914 |  | 
|  | 915 | <div class="rationale"><p>Rationale: this is all admittedly | 
|  | 916 | convoluted.  In an ideal world, we would see that a local variable is | 
|  | 917 | being passed to an out-parameter and retroactively modify its type to | 
|  | 918 | be <tt>__autoreleasing</tt> rather than <tt>__strong</tt>.  This would | 
|  | 919 | be remarkably difficult and not always well-founded under the C type | 
|  | 920 | system.  However, it was judged unacceptably invasive to require | 
|  | 921 | programmers to write <tt>__autoreleasing</tt> on all the variables | 
|  | 922 | they intend to use for out-parameters.  This was the least bad | 
|  | 923 | solution.</p></div> | 
|  | 924 |  | 
|  | 925 | </div> | 
|  | 926 |  | 
|  | 927 | <div id="ownership.restrictions.records"> | 
|  | 928 | <h1>Ownership-qualified fields of structs and unions</h1> | 
|  | 929 |  | 
|  | 930 | <p>A program is ill-formed if it declares a member of a C struct or | 
|  | 931 | union to have a nontrivially ownership-qualified type.</p> | 
|  | 932 |  | 
|  | 933 | <div class="rationale"><p>Rationale: the resulting type would be | 
|  | 934 | non-POD in the C++ sense, but C does not give us very good language | 
|  | 935 | tools for managing the lifetime of aggregates, so it is more | 
|  | 936 | convenient to simply forbid them.  It is still possible to manage this | 
|  | 937 | with a <tt>void*</tt> or an <tt>__unsafe_unretained</tt> | 
|  | 938 | object.</p></div> | 
|  | 939 |  | 
|  | 940 | <p>This restriction does not apply in Objective-C++.  However, | 
|  | 941 | nontrivally ownership-qualified types are considered non-POD: in C++0x | 
|  | 942 | terms, they are not trivially default constructible, copy | 
|  | 943 | constructible, move constructible, copy assignable, move assignable, | 
|  | 944 | or destructible.  It is a violation of C++ One Definition Rule to use | 
|  | 945 | a class outside of ARC that, under ARC, would have an | 
|  | 946 | ownership-qualified member.</p> | 
|  | 947 |  | 
|  | 948 | <div class="rationale"><p>Rationale: unlike in C, we can express all | 
|  | 949 | the necessary ARC semantics for ownership-qualified subobjects as | 
|  | 950 | suboperations of the (default) special member functions for the class. | 
|  | 951 | These functions then become non-trivial.  This has the non-obvious | 
|  | 952 | repercussion that the class will have a non-trivial copy constructor | 
|  | 953 | and non-trivial destructor; if it wouldn't outside of ARC, this means | 
|  | 954 | that objects of the type will be passed and returned in an | 
|  | 955 | ABI-incompatible manner.</p></div> | 
|  | 956 |  | 
|  | 957 | </div> | 
|  | 958 |  | 
|  | 959 | </div> | 
|  | 960 |  | 
|  | 961 | <div id="ownership.inference"> | 
|  | 962 | <h1>Ownership inference</h1> | 
|  | 963 |  | 
|  | 964 | <div id="ownership.inference.variables"> | 
|  | 965 | <h1>Objects</h1> | 
|  | 966 |  | 
|  | 967 | <p>If an object is declared with retainable object owner type, but | 
|  | 968 | without an explicit ownership qualifier, its type is implicitly | 
|  | 969 | adjusted to have <tt>__strong</tt> qualification.</p> | 
|  | 970 |  | 
|  | 971 | <p>As a special case, if the object's base type is <tt>Class</tt> | 
|  | 972 | (possibly protocol-qualified), the type is adjusted to | 
|  | 973 | have <tt>__unsafe_unretained</tt> qualification instead.</p> | 
|  | 974 |  | 
|  | 975 | </div> | 
|  | 976 |  | 
|  | 977 | <div id="ownership.inference.indirect_parameters"> | 
|  | 978 | <h1>Indirect parameters</h1> | 
|  | 979 |  | 
|  | 980 | <p>If a function or method parameter has type <tt>T*</tt>, where | 
|  | 981 | <tt>T</tt> is an ownership-unqualified retainable object pointer type, | 
|  | 982 | then:</p> | 
|  | 983 |  | 
|  | 984 | <ul> | 
|  | 985 | <li>if <tt>T</tt> is <tt>const</tt>-qualified or <tt>Class</tt>, then | 
|  | 986 | it is implicitly qualified with <tt>__unsafe_unretained</tt>;</li> | 
|  | 987 | <li>otherwise, it is implicitly qualified | 
|  | 988 | with <tt>__autoreleasing</tt>.</li> | 
|  | 989 | </ul> | 
|  | 990 | </p> | 
|  | 991 |  | 
|  | 992 | <div class="rationale"><p>Rationale: <tt>__autoreleasing</tt> exists | 
|  | 993 | mostly for this case, the Cocoa convention for out-parameters.  Since | 
|  | 994 | a pointer to <tt>const</tt> is obviously not an out-parameter, we | 
|  | 995 | instead use a type more useful for passing arrays.  If the user | 
|  | 996 | instead intends to pass in a <em>mutable</em> array, inferring | 
|  | 997 | <tt>__autoreleasing</tt> is the wrong thing to do; this directs some | 
|  | 998 | of the caution in the following rules about writeback.</p></div> | 
|  | 999 |  | 
|  | 1000 | <p>Such a type written anywhere else would be ill-formed by the | 
|  | 1001 | general rule requiring ownership qualifiers.</p> | 
|  | 1002 |  | 
|  | 1003 | <p>This rule does not apply in Objective-C++ if a parameter's type is | 
|  | 1004 | dependent in a template pattern and is only <em>instantiated</em> to | 
|  | 1005 | a type which would be a pointer to an unqualified retainable object | 
|  | 1006 | pointer type.  Such code is still ill-formed.</p> | 
|  | 1007 |  | 
|  | 1008 | <div class="rationale"><p>Rationale: the convention is very unlikely | 
|  | 1009 | to be intentional in template code.</p></div> | 
|  | 1010 |  | 
|  | 1011 | </div> <!-- ownership.inference.indirect_parameters --> | 
| Douglas Gregor | e559ca1 | 2011-06-17 22:11:49 +0000 | [diff] [blame] | 1012 |  | 
|  | 1013 | <div id="ownership.inference.template_arguments"> | 
|  | 1014 | <h1>Template arguments</h1> | 
|  | 1015 |  | 
|  | 1016 | <p>If a template argument for a template type parameter is an | 
|  | 1017 | retainable object owner type that does not have an explicit ownership | 
|  | 1018 | qualifier, it is adjusted to have <tt>__strong</tt> | 
| Douglas Gregor | 54fb28a | 2011-06-17 22:19:27 +0000 | [diff] [blame] | 1019 | qualification. This adjustment occurs regardless of whether the | 
| Douglas Gregor | e559ca1 | 2011-06-17 22:11:49 +0000 | [diff] [blame] | 1020 | template argument was deduced or explicitly specified. </p> | 
|  | 1021 |  | 
|  | 1022 | <div class="rationale"><p>Rationale: <tt>__strong</tt> is a useful default for containers (e.g., <tt>std::vector<id></tt>), which would otherwise require explicit qualification. Moreover, unqualified retainable object pointer types are unlikely to be useful within templates, since they generally need to have a qualifier applied to the before being used.</p></div> | 
|  | 1023 |  | 
|  | 1024 | </div> <!-- ownership.inference.template_arguments --> | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 1025 | </div> <!-- ownership.inference --> | 
|  | 1026 | </div> <!-- ownership --> | 
|  | 1027 |  | 
| Douglas Gregor | e559ca1 | 2011-06-17 22:11:49 +0000 | [diff] [blame] | 1028 |  | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 1029 | <div id="family"> | 
|  | 1030 | <h1>Method families</h1> | 
|  | 1031 |  | 
|  | 1032 | <p>An Objective-C method may fall into a <span class="term">method | 
|  | 1033 | family</span>, which is a conventional set of behaviors ascribed to it | 
|  | 1034 | by the Cocoa conventions.</p> | 
|  | 1035 |  | 
|  | 1036 | <p>A method is in a certain method family if: | 
|  | 1037 | <ul> | 
|  | 1038 | <li>it has a <tt>objc_method_family</tt> attribute placing it in that | 
|  | 1039 | family; or if not that,</li> | 
|  | 1040 | <li>it does not have an <tt>objc_method_family</tt> attribute placing | 
|  | 1041 | it in a different or no family, and</li> | 
|  | 1042 | <li>its selector falls into the corresponding selector family, and</li> | 
|  | 1043 | <li>its signature obeys the added restrictions of the method family.</li> | 
|  | 1044 | </ul></p> | 
|  | 1045 |  | 
|  | 1046 | <p>A selector is in a certain selector family if, ignoring any leading | 
|  | 1047 | underscores, the first component of the selector either consists | 
|  | 1048 | entirely of the name of the method family or it begins with that name | 
|  | 1049 | followed by a character other than a lowercase letter.  For | 
|  | 1050 | example, <tt>_perform:with:</tt> and <tt>performWith:</tt> would fall | 
|  | 1051 | into the <tt>perform</tt> family (if we recognized one), | 
|  | 1052 | but <tt>performing:with</tt> would not.</p> | 
|  | 1053 |  | 
|  | 1054 | <p>The families and their added restrictions are:</p> | 
|  | 1055 |  | 
|  | 1056 | <ul> | 
|  | 1057 | <li><tt>alloc</tt> methods must return a retainable object pointer type.</li> | 
|  | 1058 | <li><tt>copy</tt> methods must return a retainable object pointer type.</li> | 
|  | 1059 | <li><tt>mutableCopy</tt> methods must return a retainable object pointer type.</li> | 
|  | 1060 | <li><tt>new</tt> methods must return a retainable object pointer type.</li> | 
|  | 1061 | <li><tt>init</tt> methods must be instance methods and must return an | 
|  | 1062 | Objective-C pointer type.  Additionally, a program is ill-formed if it | 
|  | 1063 | declares or contains a call to an <tt>init</tt> method whose return | 
|  | 1064 | type is neither <tt>id</tt> nor a pointer to a super-class or | 
| John McCall | be16b89 | 2011-06-18 08:15:19 +0000 | [diff] [blame] | 1065 | sub-class of the declaring class (if the method was declared on | 
|  | 1066 | a class) or the static receiver type of the call (if it was declared | 
|  | 1067 | on a protocol).</p> | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 1068 |  | 
|  | 1069 | <div class="rationale"><p>Rationale: there are a fair number of existing | 
|  | 1070 | methods with <tt>init</tt>-like selectors which nonetheless don't | 
|  | 1071 | follow the <tt>init</tt> conventions.  Typically these are either | 
|  | 1072 | accidental naming collisions or helper methods called during | 
|  | 1073 | initialization.  Because of the peculiar retain/release behavior | 
|  | 1074 | of <tt>init</tt> methods, it's very important not to treat these | 
|  | 1075 | methods as <tt>init</tt> methods if they aren't meant to be.  It was | 
|  | 1076 | felt that implicitly defining these methods out of the family based on | 
|  | 1077 | the exact relationship between the return type and the declaring class | 
| John McCall | be16b89 | 2011-06-18 08:15:19 +0000 | [diff] [blame] | 1078 | would be much too subtle and fragile.  Therefore we identify a small | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 1079 | number of legitimate-seeming return types and call everything else an | 
|  | 1080 | error.  This serves the secondary purpose of encouraging programmers | 
| John McCall | be16b89 | 2011-06-18 08:15:19 +0000 | [diff] [blame] | 1081 | not to accidentally give methods names in the <tt>init</tt> family.</p> | 
|  | 1082 |  | 
|  | 1083 | <p>Note that a method with an <tt>init</tt>-family selector which | 
|  | 1084 | returns a non-Objective-C type (e.g. <tt>void</tt>) is perfectly | 
|  | 1085 | well-formed; it simply isn't in the <tt>init</tt> family.</p></div> | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 1086 | </li> | 
|  | 1087 | </ul> | 
|  | 1088 |  | 
|  | 1089 | <p>A program is ill-formed if a method's declarations, | 
|  | 1090 | implementations, and overrides do not all have the same method | 
|  | 1091 | family.</p> | 
|  | 1092 |  | 
|  | 1093 | <div id="family.attribute"> | 
|  | 1094 | <h1>Explicit method family control</h1> | 
|  | 1095 |  | 
|  | 1096 | <p>A method may be annotated with the <tt>objc_method_family</tt> | 
|  | 1097 | attribute to precisely control which method family it belongs to.  If | 
|  | 1098 | a method in an <tt>@implementation</tt> does not have this attribute, | 
|  | 1099 | but there is a method declared in the corresponding <tt>@interface</tt> | 
|  | 1100 | that does, then the attribute is copied to the declaration in the | 
|  | 1101 | <tt>@implementation</tt>.  The attribute is available outside of ARC, | 
|  | 1102 | and may be tested for with the preprocessor query | 
|  | 1103 | <tt>__has_attribute(objc_method_family)</tt>.</p> | 
|  | 1104 |  | 
|  | 1105 | <p>The attribute is spelled | 
|  | 1106 | <tt>__attribute__((objc_method_family(<i>family</i>)))</tt>. | 
|  | 1107 | If <i>family</i> is <tt>none</tt>, the method has no family, even if | 
|  | 1108 | it would otherwise be considered to have one based on its selector and | 
|  | 1109 | type.  Otherwise, <i>family</i> must be one | 
|  | 1110 | of <tt>alloc</tt>, <tt>copy</tt>, <tt>init</tt>, | 
|  | 1111 | <tt>mutableCopy</tt>, or <tt>new</tt>, in which case the method is | 
|  | 1112 | considered to belong to the corresponding family regardless of its | 
|  | 1113 | selector.  It is an error if a method that is explicitly added to a | 
|  | 1114 | family in this way does not meet the requirements of the family other | 
|  | 1115 | than the selector naming convention.</p> | 
|  | 1116 |  | 
|  | 1117 | <div class="rationale"><p>Rationale: the rules codified in this document | 
|  | 1118 | describe the standard conventions of Objective-C.  However, as these | 
|  | 1119 | conventions have not heretofore been enforced by an unforgiving | 
|  | 1120 | mechanical system, they are only imperfectly kept, especially as they | 
|  | 1121 | haven't always even been precisely defined.  While it is possible to | 
|  | 1122 | define low-level ownership semantics with attributes like | 
|  | 1123 | <tt>ns_returns_retained</tt>, this attribute allows the user to | 
|  | 1124 | communicate semantic intent, which of use both to ARC (which, e.g., | 
|  | 1125 | treats calls to <tt>init</tt> specially) and the static analyzer.</p></div> | 
|  | 1126 | </div> | 
|  | 1127 |  | 
|  | 1128 | <div id="family.semantics"> | 
|  | 1129 | <h1>Semantics of method families</h1> | 
|  | 1130 |  | 
|  | 1131 | <p>A method's membership in a method family may imply non-standard | 
|  | 1132 | semantics for its parameters and return type.</p> | 
|  | 1133 |  | 
|  | 1134 | <p>Methods in the <tt>alloc</tt>, <tt>copy</tt>, <tt>mutableCopy</tt>, | 
|  | 1135 | and <tt>new</tt> families — that is, methods in all the | 
| John McCall | be16b89 | 2011-06-18 08:15:19 +0000 | [diff] [blame] | 1136 | currently-defined families except <tt>init</tt> — implicitly | 
|  | 1137 | <a href="#objects.operands.retained_returns">return a retained | 
|  | 1138 | object</a> as if they were annotated with | 
|  | 1139 | the <tt>ns_returns_retained</tt> attribute.  This can be overridden by | 
|  | 1140 | annotating the method with either of | 
|  | 1141 | the <tt>ns_returns_autoreleased</tt> or | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 1142 | <tt>ns_returns_not_retained</tt> attributes.</p> | 
|  | 1143 |  | 
| Fariborz Jahanian | acd4aaf | 2011-07-06 22:47:46 +0000 | [diff] [blame^] | 1144 | <p>Properties also follow same naming rules as methods. This means that | 
|  | 1145 | those in the <tt>alloc</tt>, <tt>copy</tt>, <tt>mutableCopy</tt>, | 
|  | 1146 | and <tt>new</tt> families provide access to | 
|  | 1147 | <a href="#objects.operands.retained_returns">retained objects</a>. | 
|  | 1148 | This can be overridden by annotating the property with | 
|  | 1149 | <tt>ns_returns_not_retained</tt> attribute.</p> | 
|  | 1150 |  | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 1151 | <div id="family.semantics.init"> | 
|  | 1152 | <h1>Semantics of <tt>init</tt></h1> | 
| John McCall | be16b89 | 2011-06-18 08:15:19 +0000 | [diff] [blame] | 1153 | <p>Methods in the <tt>init</tt> family implicitly | 
|  | 1154 | <a href="#objects.operands.consumed">consume</a> their <tt>self</tt> | 
|  | 1155 | parameter and <a href="#objects.operands.retained_returns">return a | 
|  | 1156 | retained object</a>.  Neither of these properties can be altered | 
|  | 1157 | through attributes.</p> | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 1158 |  | 
|  | 1159 | <p>A call to an <tt>init</tt> method with a receiver that is either | 
|  | 1160 | <tt>self</tt> (possibly parenthesized or casted) or <tt>super</tt> is | 
|  | 1161 | called a <span class="term">delegate init call</span>.  It is an error | 
|  | 1162 | for a delegate init call to be made except from an <tt>init</tt> | 
|  | 1163 | method, and excluding blocks within such methods.</p> | 
|  | 1164 |  | 
| John McCall | be16b89 | 2011-06-18 08:15:19 +0000 | [diff] [blame] | 1165 | <p>As an exception to the <a href="misc.self">usual rule</a>, the | 
|  | 1166 | variable <tt>self</tt> is mutable in an <tt>init</tt> method and has | 
|  | 1167 | the usual semantics for a <tt>__strong</tt> variable.  However, it is | 
|  | 1168 | undefined behavior and the program is ill-formed, no diagnostic | 
|  | 1169 | required, if an <tt>init</tt> method attempts to use the previous | 
|  | 1170 | value of <tt>self</tt> after the completion of a delegate init call. | 
|  | 1171 | It is conventional, but not required, for an <tt>init</tt> method to | 
|  | 1172 | return <tt>self</tt>.</p> | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 1173 |  | 
| John McCall | be16b89 | 2011-06-18 08:15:19 +0000 | [diff] [blame] | 1174 | <p>It is undefined behavior for a program to cause two or more calls | 
|  | 1175 | to <tt>init</tt> methods on the same object, except that | 
|  | 1176 | each <tt>init</tt> method invocation may perform at most one delegate | 
|  | 1177 | init call.</p> | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 1178 |  | 
| John McCall | f3d08a6 | 2011-06-18 07:31:30 +0000 | [diff] [blame] | 1179 | </div> <!-- family.semantics.init --> | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 1180 |  | 
|  | 1181 | <div id="family.semantics.result_type"> | 
|  | 1182 | <h1>Related result types</h1> | 
|  | 1183 |  | 
|  | 1184 | <p>Certain methods are candidates to have <span class="term">related | 
|  | 1185 | result types</span>:</p> | 
|  | 1186 | <ul> | 
|  | 1187 | <li>class methods in the <tt>alloc</tt> and <tt>new</tt> method families</li> | 
|  | 1188 | <li>instance methods in the <tt>init</tt> family</li> | 
|  | 1189 | <li>the instance method <tt>self</tt></li> | 
|  | 1190 | <li>outside of ARC, the instance methods <tt>retain</tt> and <tt>autorelease</tt></li> | 
|  | 1191 | </ul> | 
|  | 1192 |  | 
|  | 1193 | <p>If the formal result type of such a method is <tt>id</tt> or | 
|  | 1194 | protocol-qualified <tt>id</tt>, or a type equal to the declaring class | 
|  | 1195 | or a superclass, then it is said to have a related result type.  In | 
|  | 1196 | this case, when invoked in an explicit message send, it is assumed to | 
|  | 1197 | return a type related to the type of the receiver:</p> | 
|  | 1198 |  | 
|  | 1199 | <ul> | 
|  | 1200 | <li>if it is a class method, and the receiver is a class | 
|  | 1201 | name <tt>T</tt>, the message send expression has type <tt>T*</tt>; | 
|  | 1202 | otherwise</li> | 
|  | 1203 | <li>if it is an instance method, and the receiver has type <tt>T</tt>, | 
|  | 1204 | the message send expression has type <tt>T</tt>; otherwise</li> | 
|  | 1205 | <li>the message send expression has the normal result type of the | 
|  | 1206 | method.</li> | 
|  | 1207 | </ul> | 
|  | 1208 |  | 
|  | 1209 | <p>This is a new rule of the Objective-C language and applies outside | 
|  | 1210 | of ARC.</p> | 
|  | 1211 |  | 
|  | 1212 | <div class="rationale"><p>Rationale: ARC's automatic code emission is | 
|  | 1213 | more prone than most code to signature errors, i.e. errors where a | 
|  | 1214 | call was emitted against one method signature, but the implementing | 
|  | 1215 | method has an incompatible signature.  Having more precise type | 
|  | 1216 | information helps drastically lower this risks, as well as catching | 
|  | 1217 | a number of latent bugs.</p></div> | 
|  | 1218 |  | 
|  | 1219 | </div> <!-- family.semantics.result_type --> | 
|  | 1220 | </div> <!-- family.semantics --> | 
|  | 1221 | </div> <!-- family --> | 
|  | 1222 |  | 
|  | 1223 | <div id="optimization"> | 
|  | 1224 | <h1>Optimization</h1> | 
|  | 1225 |  | 
|  | 1226 | <p>ARC applies aggressive rules for the optimization of local | 
|  | 1227 | behavior.  These rules are based around a core assumption of | 
|  | 1228 | <span class="term">local balancing</span>: that other code will | 
|  | 1229 | perform retains and releases as necessary (and only as necessary) for | 
|  | 1230 | its own safety, and so the optimizer does not need to consider global | 
|  | 1231 | properties of the retain and release sequence.  For example, if a | 
|  | 1232 | retain and release immediately bracket a call, the optimizer can | 
|  | 1233 | delete the retain and release on the assumption that the called | 
|  | 1234 | function will not do a constant number of unmotivated releases | 
|  | 1235 | followed by a constant number of <q>balancing</q> retains, such that | 
|  | 1236 | the local retain/release pair is the only thing preventing the called | 
|  | 1237 | function from ending up with a dangling reference.</p> | 
|  | 1238 |  | 
|  | 1239 | <p>The optimizer assumes that when a new value enters local control, | 
|  | 1240 | e.g. from a load of a non-local object or as the result of a function | 
|  | 1241 | call, it is instaneously valid.  Subsequently, a retain and release of | 
|  | 1242 | a value are necessary on a computation path only if there is a use of | 
|  | 1243 | that value before the release and after any operation which might | 
|  | 1244 | cause a release of the value (including indirectly or non-locally), | 
|  | 1245 | and only if the value is not demonstrably already retained.</p> | 
|  | 1246 |  | 
|  | 1247 | <p>The complete optimization rules are quite complicated, but it would | 
|  | 1248 | still be useful to document them here.</p> | 
|  | 1249 |  | 
|  | 1250 | </div> | 
|  | 1251 |  | 
|  | 1252 | <div id="misc"> | 
|  | 1253 | <h1>Miscellaneous</h1> | 
|  | 1254 |  | 
| John McCall | f3d08a6 | 2011-06-18 07:31:30 +0000 | [diff] [blame] | 1255 | <div id="misc.special_methods"> | 
|  | 1256 | <h1>Special methods</h1> | 
|  | 1257 |  | 
|  | 1258 | <div id="misc.special_methods.retain"> | 
|  | 1259 | <h1>Memory management methods</h1> | 
|  | 1260 |  | 
|  | 1261 | <p>A program is ill-formed if it contains a method definition, message | 
|  | 1262 | send, or <tt>@selector</tt> expression for any of the following | 
|  | 1263 | selectors: | 
|  | 1264 | <ul> | 
|  | 1265 | <li><tt>autorelease</tt></li> | 
|  | 1266 | <li><tt>release</tt></li> | 
|  | 1267 | <li><tt>retain</tt></li> | 
|  | 1268 | <li><tt>retainCount</tt></li> | 
|  | 1269 | </ul> | 
|  | 1270 | </p> | 
|  | 1271 |  | 
|  | 1272 | <div class="rationale"><p>Rationale: <tt>retainCount</tt> is banned | 
|  | 1273 | because ARC robs it of consistent semantics.  The others were banned | 
|  | 1274 | after weighing three options for how to deal with message sends:</p> | 
|  | 1275 |  | 
|  | 1276 | <p><b>Honoring</b> them would work out very poorly if a programmer | 
|  | 1277 | naively or accidentally tried to incorporate code written for manual | 
|  | 1278 | retain/release code into an ARC program.  At best, such code would do | 
|  | 1279 | twice as much work as necessary; quite frequently, however, ARC and | 
|  | 1280 | the explicit code would both try to balance the same retain, leading | 
|  | 1281 | to crashes.  The cost is losing the ability to perform <q>unrooted</q> | 
|  | 1282 | retains, i.e. retains not logically corresponding to a strong | 
|  | 1283 | reference in the object graph.</p> | 
|  | 1284 |  | 
|  | 1285 | <p><b>Ignoring</b> them would badly violate user expectations about their | 
|  | 1286 | code.  While it <em>would</em> make it easier to develop code simultaneously | 
|  | 1287 | for ARC and non-ARC, there is very little reason to do so except for | 
|  | 1288 | certain library developers.  ARC and non-ARC translation units share | 
|  | 1289 | an execution model and can seamlessly interoperate.  Within a | 
|  | 1290 | translation unit, a developer who faithfully maintains their code in | 
|  | 1291 | non-ARC mode is suffering all the restrictions of ARC for zero | 
|  | 1292 | benefit, while a developer who isn't testing the non-ARC mode is | 
|  | 1293 | likely to be unpleasantly surprised if they try to go back to it.</p> | 
|  | 1294 |  | 
|  | 1295 | <p><b>Banning</b> them has the disadvantage of making it very awkward | 
|  | 1296 | to migrate existing code to ARC.  The best answer to that, given a | 
|  | 1297 | number of other changes and restrictions in ARC, is to provide a | 
|  | 1298 | specialized tool to assist users in that migration.</p> | 
|  | 1299 |  | 
|  | 1300 | <p>Implementing these methods was banned because they are too integral | 
|  | 1301 | to the semantics of ARC; many tricks which worked tolerably under | 
|  | 1302 | manual reference counting will misbehave if ARC performs an ephemeral | 
|  | 1303 | extra retain or two.  If absolutely required, it is still possible to | 
|  | 1304 | implement them in non-ARC code, for example in a category; the | 
|  | 1305 | implementations must obey the <a href="#objects.retains">semantics</a> | 
|  | 1306 | laid out elsewhere in this document.</p> | 
|  | 1307 |  | 
|  | 1308 | </div> | 
|  | 1309 | </div> <!-- misc.special_methods.retain --> | 
|  | 1310 |  | 
|  | 1311 | <div id="misc.special_methods.dealloc"> | 
|  | 1312 | <h1><tt>dealloc</tt></h1> | 
|  | 1313 |  | 
|  | 1314 | <p>A program is ill-formed if it contains a message send | 
|  | 1315 | or <tt>@selector</tt> expression for the selector <tt>dealloc</tt>.</p> | 
|  | 1316 |  | 
|  | 1317 | <div class="rationale"><p>Rationale: there are no legitimate reasons | 
|  | 1318 | to call <tt>dealloc</tt> directly.</p></div> | 
|  | 1319 |  | 
|  | 1320 | <p>A class may provide a method definition for an instance method | 
|  | 1321 | named <tt>dealloc</tt>.  This method will be called after the final | 
|  | 1322 | <tt>release</tt> of the object but before it is deallocated or any of | 
|  | 1323 | its instance variables are destroyed.  The superclass's implementation | 
|  | 1324 | of <tt>dealloc</tt> will be called automatically when the method | 
|  | 1325 | returns.</p> | 
|  | 1326 |  | 
|  | 1327 | <div class="rationale"><p>Rationale: even though ARC destroys instance | 
|  | 1328 | variables automatically, there are still legitimate reasons to write | 
|  | 1329 | a <tt>dealloc</tt> method, such as freeing non-retainable resources. | 
|  | 1330 | Failing to call <tt>[super dealloc]</tt> in such a method is nearly | 
|  | 1331 | always a bug.  Sometimes, the object is simply trying to prevent | 
|  | 1332 | itself from being destroyed, but <tt>dealloc</tt> is really far too | 
|  | 1333 | late for the object to be raising such objections.  Somewhat more | 
|  | 1334 | legitimately, an object may have been pool-allocated and should not be | 
|  | 1335 | deallocated with <tt>free</tt>; for now, this can only be supported | 
|  | 1336 | with a <tt>dealloc</tt> implementation outside of ARC.  Such an | 
|  | 1337 | implementation must be very careful to do all the other work | 
|  | 1338 | that <tt>NSObject</tt>'s <tt>dealloc</tt> would, which is outside the | 
|  | 1339 | scope of this document to describe.</p></div> | 
|  | 1340 |  | 
|  | 1341 | </div> | 
|  | 1342 |  | 
|  | 1343 | </div> <!-- misc.special_methods --> | 
|  | 1344 |  | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 1345 | <div id="autoreleasepool"> | 
|  | 1346 | <h1><tt>@autoreleasepool</tt></h1> | 
|  | 1347 |  | 
|  | 1348 | <p>To simplify the use of autorelease pools, and to bring them under | 
|  | 1349 | the control of the compiler, a new kind of statement is available in | 
|  | 1350 | Objective-C.  It is written <tt>@autoreleasepool</tt> followed by | 
|  | 1351 | a <i>compound-statement</i>, i.e. by a new scope delimited by curly | 
|  | 1352 | braces.  Upon entry to this block, the current state of the | 
|  | 1353 | autorelease pool is captured.  When the block is exited normally, | 
|  | 1354 | whether by fallthrough or directed control flow (such | 
|  | 1355 | as <tt>return</tt> or <tt>break</tt>), the autorelease pool is | 
|  | 1356 | restored to the saved state, releasing all the objects in it.  When | 
|  | 1357 | the block is exited with an exception, the pool is not drained.</p> | 
|  | 1358 |  | 
| John McCall | f3d08a6 | 2011-06-18 07:31:30 +0000 | [diff] [blame] | 1359 | <p><tt>@autoreleasepool</tt> may be used in non-ARC translation units, | 
|  | 1360 | with equivalent semantics.</p> | 
|  | 1361 |  | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 1362 | <p>A program is ill-formed if it refers to the | 
|  | 1363 | <tt>NSAutoreleasePool</tt> class.</p> | 
|  | 1364 |  | 
|  | 1365 | <div class="rationale"><p>Rationale: autorelease pools are clearly | 
|  | 1366 | important for the compiler to reason about, but it is far too much to | 
|  | 1367 | expect the compiler to accurately reason about control dependencies | 
|  | 1368 | between two calls.  It is also very easy to accidentally forget to | 
|  | 1369 | drain an autorelease pool when using the manual API, and this can | 
|  | 1370 | significantly inflate the process's high-water-mark.  The introduction | 
|  | 1371 | of a new scope is unfortunate but basically required for sane | 
|  | 1372 | interaction with the rest of the language.  Not draining the pool | 
|  | 1373 | during an unwind is apparently required by the Objective-C exceptions | 
|  | 1374 | implementation.</p></div> | 
|  | 1375 |  | 
|  | 1376 | </div> <!-- autoreleasepool --> | 
|  | 1377 |  | 
|  | 1378 | <div id="misc.self"> | 
|  | 1379 | <h1><tt>self</tt></h1> | 
|  | 1380 |  | 
|  | 1381 | <p>The <tt>self</tt> parameter variable of an Objective-C method is | 
|  | 1382 | never actually retained by the implementation.  It is undefined | 
|  | 1383 | behavior, or at least dangerous, to cause an object to be deallocated | 
|  | 1384 | during a message send to that object.  To make this | 
|  | 1385 | safe, <tt>self</tt> is implicitly <tt>const</tt> unless the method is | 
|  | 1386 | in the <a href="#family.semantics.init"><tt>init</tt> family</a>.</p> | 
|  | 1387 |  | 
|  | 1388 | <div class="rationale"><p>Rationale: the cost of | 
|  | 1389 | retaining <tt>self</tt> in all methods was found to be prohibitive, as | 
|  | 1390 | it tends to be live across calls, preventing the optimizer from | 
|  | 1391 | proving that the retain and release are unnecessary — for good | 
|  | 1392 | reason, as it's quite possible in theory to cause an object to be | 
|  | 1393 | deallocated during its execution without this retain and release. | 
|  | 1394 | Since it's extremely uncommon to actually do so, even unintentionally, | 
|  | 1395 | and since there's no natural way for the programmer to remove this | 
|  | 1396 | retain/release pair otherwise (as there is for other parameters by, | 
|  | 1397 | say, making the variable <tt>__unsafe_unretained</tt>), we chose to | 
|  | 1398 | make this optimizing assumption and shift some amount of risk to the | 
|  | 1399 | user.</p></div> | 
|  | 1400 |  | 
|  | 1401 | </div> <!-- misc.self --> | 
|  | 1402 |  | 
|  | 1403 | <div id="misc.enumeration"> | 
|  | 1404 | <h1>Fast enumeration iteration variables</h1> | 
|  | 1405 |  | 
|  | 1406 | <p>If a variable is declared in the condition of an Objective-C fast | 
|  | 1407 | enumeration loop, and the variable has no explicit ownership | 
|  | 1408 | qualifier, then it is qualified with <tt>const __strong</tt> and | 
|  | 1409 | objects encountered during the enumeration are not actually | 
|  | 1410 | retained.</p> | 
|  | 1411 |  | 
|  | 1412 | <div class="rationale"><p>Rationale: this is an optimization made | 
|  | 1413 | possible because fast enumeration loops promise to keep the objects | 
|  | 1414 | retained during enumeration, and the collection itself cannot be | 
|  | 1415 | synchronously modified.  It can be overridden by explicitly qualifying | 
|  | 1416 | the variable with <tt>__strong</tt>, which will make the variable | 
|  | 1417 | mutable again and cause the loop to retain the objects it | 
|  | 1418 | encounters.</div> | 
|  | 1419 |  | 
|  | 1420 | </div> | 
|  | 1421 |  | 
|  | 1422 | <div id="misc.blocks"> | 
|  | 1423 | <h1>Blocks</h1> | 
|  | 1424 |  | 
|  | 1425 | <p>The implicit <tt>const</tt> capture variables created when | 
|  | 1426 | evaluating a block literal expression have the same ownership | 
|  | 1427 | semantics as the local variables they capture.  The capture is | 
|  | 1428 | performed by reading from the captured variable and initializing the | 
|  | 1429 | capture variable with that value; the capture variable is destroyed | 
|  | 1430 | when the block literal is, i.e. at the end of the enclosing scope.</p> | 
|  | 1431 |  | 
|  | 1432 | <p>The <a href="#ownership.inference">inference</a> rules apply | 
|  | 1433 | equally to <tt>__block</tt> variables, which is a shift in semantics | 
|  | 1434 | from non-ARC, where <tt>__block</tt> variables did not implicitly | 
|  | 1435 | retain during capture.</p> | 
|  | 1436 |  | 
|  | 1437 | <p><tt>__block</tt> variables of retainable object owner type are | 
|  | 1438 | moved off the stack by initializing the heap copy with the result of | 
|  | 1439 | moving from the stack copy.</tt></p> | 
|  | 1440 |  | 
|  | 1441 | <p>With the exception of retains done as part of initializing | 
|  | 1442 | a <tt>__strong</tt> parameter variable or reading a <tt>__weak</tt> | 
|  | 1443 | variable, whenever these semantics call for retaining a value of | 
|  | 1444 | block-pointer type, it has the effect of a <tt>Block_copy</tt>.  The | 
|  | 1445 | optimizer may remove such copies when it sees that the result is | 
|  | 1446 | used only as an argument to a call.</p> | 
|  | 1447 |  | 
|  | 1448 | </div> <!-- misc.blocks --> | 
|  | 1449 |  | 
|  | 1450 | <div id="misc.exceptions"> | 
|  | 1451 | <h1>Exceptions</h1> | 
|  | 1452 |  | 
|  | 1453 | <p>By default in Objective C, ARC is not exception-safe for normal | 
|  | 1454 | releases: | 
|  | 1455 | <ul> | 
|  | 1456 | <li>It does not end the lifetime of <tt>__strong</tt> variables when | 
|  | 1457 | their scopes are abnormally terminated by an exception.</li> | 
|  | 1458 | <li>It does not perform releases which would occur at the end of | 
|  | 1459 | a full-expression if that full-expression throws an exception.</li> | 
|  | 1460 | </ul> | 
|  | 1461 |  | 
|  | 1462 | <p>A program may be compiled with the option | 
|  | 1463 | <tt>-fobjc-arc-exceptions</tt> in order to enable these, or with the | 
|  | 1464 | option <tt>-fno-objc-arc-exceptions</tt> to explicitly disable them, | 
|  | 1465 | with the last such argument <q>winning</q>.</p> | 
|  | 1466 |  | 
|  | 1467 | <div class="rationale"><p>Rationale: the standard Cocoa convention is | 
|  | 1468 | that exceptions signal programmer error and are not intended to be | 
|  | 1469 | recovered from.  Making code exceptions-safe by default would impose | 
|  | 1470 | severe runtime and code size penalties on code that typically does not | 
|  | 1471 | actually care about exceptions safety.  Therefore, ARC-generated code | 
|  | 1472 | leaks by default on exceptions, which is just fine if the process is | 
|  | 1473 | going to be immediately terminated anyway.  Programs which do care | 
|  | 1474 | about recovering from exceptions should enable the option.</p></div> | 
|  | 1475 |  | 
|  | 1476 | <p>In Objective-C++, <tt>-fobjc-arc-exceptions</tt> is enabled by | 
|  | 1477 | default.</p> | 
|  | 1478 |  | 
|  | 1479 | <div class="rationale"><p>Rationale: C++ already introduces pervasive | 
|  | 1480 | exceptions-cleanup code of the sort that ARC introduces.  C++ | 
|  | 1481 | programmers who have not already disabled exceptions are much more | 
|  | 1482 | likely to actual require exception-safety.</p></div> | 
|  | 1483 |  | 
|  | 1484 | <p>ARC does end the lifetimes of <tt>__weak</tt> objects when an | 
|  | 1485 | exception terminates their scope unless exceptions are disabled in the | 
|  | 1486 | compiler.</p> | 
|  | 1487 |  | 
|  | 1488 | <div class="rationale"><p>Rationale: the consequence of a | 
|  | 1489 | local <tt>__weak</tt> object not being destroyed is very likely to be | 
|  | 1490 | corruption of the Objective-C runtime, so we want to be safer here. | 
|  | 1491 | Of course, potentially massive leaks are about as likely to take down | 
|  | 1492 | the process as this corruption is if the program does try to recover | 
|  | 1493 | from exceptions.</p></div> | 
|  | 1494 |  | 
|  | 1495 | </div> <!-- misc.exceptions --> | 
|  | 1496 |  | 
|  | 1497 | </div> <!-- misc --> | 
| John McCall | 98a48cf | 2011-06-19 09:36:02 +0000 | [diff] [blame] | 1498 |  | 
|  | 1499 | <div id="runtime"> | 
|  | 1500 | <h1>Runtime support</h1> | 
|  | 1501 |  | 
| John McCall | 085d09d | 2011-06-19 10:12:24 +0000 | [diff] [blame] | 1502 | <p>This section describes the interaction between the ARC runtime and | 
|  | 1503 | the code generated by the ARC compiler.  This is not part of the ARC | 
|  | 1504 | language specification; instead, it is effectively a language-specific | 
|  | 1505 | ABI supplement, akin to the <q>Itanium</q> generic ABI for C++.</p> | 
| John McCall | 98a48cf | 2011-06-19 09:36:02 +0000 | [diff] [blame] | 1506 |  | 
|  | 1507 | <p>Ownership qualification does not alter the storage requirements for | 
| John McCall | 085d09d | 2011-06-19 10:12:24 +0000 | [diff] [blame] | 1508 | objects, except that it is undefined behavior if a <tt>__weak</tt> | 
|  | 1509 | object is inadequately aligned for an object of type <tt>id</tt>.  The | 
|  | 1510 | other qualifiers may be used on explicitly under-aligned memory.</p> | 
| John McCall | 98a48cf | 2011-06-19 09:36:02 +0000 | [diff] [blame] | 1511 |  | 
|  | 1512 | <p>The runtime tracks <tt>__weak</tt> objects which holds non-null | 
| John McCall | 3914a30 | 2011-06-19 09:59:33 +0000 | [diff] [blame] | 1513 | values.  It is undefined behavior to direct modify a <tt>__weak</tt> | 
|  | 1514 | object which is being tracked by the runtime except through an | 
|  | 1515 | <a href="#runtime.objc_storeWeak"><tt>objc_storeWeak</tt></a>, | 
|  | 1516 | <a href="#runtime.objc_destroyWeak"><tt>objc_destroyWeak</tt></a>, | 
|  | 1517 | or <a href="#runtime.objc_moveWeak"><tt>objc_moveWeak</tt></a> | 
| John McCall | 98a48cf | 2011-06-19 09:36:02 +0000 | [diff] [blame] | 1518 | call.</p> | 
|  | 1519 |  | 
| John McCall | 3914a30 | 2011-06-19 09:59:33 +0000 | [diff] [blame] | 1520 | <p>The runtime must provide a number of new entrypoints which the | 
|  | 1521 | compiler may emit, which are described in the remainder of this | 
|  | 1522 | section.</p> | 
|  | 1523 |  | 
|  | 1524 | <div class="rationale"><p>Rationale: Several of these functions are | 
|  | 1525 | semantically equivalent to a message send; we emit calls to C | 
|  | 1526 | functions instead because:</p> | 
|  | 1527 | <ul> | 
|  | 1528 | <li>the machine code to do so is significantly smaller,</li> | 
|  | 1529 | <li>it is much easier to recognize the C functions in the ARC optimizer, and</li> | 
|  | 1530 | <li>a sufficient sophisticated runtime may be able to avoid the | 
|  | 1531 | message send in common cases.</li> | 
|  | 1532 | </ul> | 
|  | 1533 |  | 
|  | 1534 | <p>Several other of these functions are <q>fused</q> operations which | 
|  | 1535 | can be described entirely in terms of other operations.  We use the | 
|  | 1536 | fused operations primarily as a code-size optimization, although in | 
|  | 1537 | some cases there is also a real potential for avoiding redundant | 
|  | 1538 | operations in the runtime.</p> | 
|  | 1539 |  | 
|  | 1540 | </div> | 
|  | 1541 |  | 
| John McCall | 98a48cf | 2011-06-19 09:36:02 +0000 | [diff] [blame] | 1542 | <div id="runtime.objc_autorelease"> | 
|  | 1543 | <h1><tt>id objc_autorelease(id value);</tt></h1> | 
|  | 1544 | <p><i>Precondition:</i> <tt>value</tt> is null or a pointer to a | 
|  | 1545 | valid object.</p> | 
|  | 1546 | <p>If <tt>value</tt> is null, this call has no effect.  Otherwise, it | 
|  | 1547 | adds the object to the innermost autorelease pool exactly as if the | 
|  | 1548 | object had been sent the <tt>autorelease</tt> message.</p> | 
|  | 1549 | <p>Always returns <tt>value</tt>.</p> | 
|  | 1550 | </div> <!-- runtime.objc_autorelease --> | 
|  | 1551 |  | 
|  | 1552 | <div id="runtime.objc_autoreleasePoolPop"> | 
|  | 1553 | <h1><tt>void objc_autoreleasePoolPop(void *pool);</tt></h1> | 
|  | 1554 | <p><i>Precondition:</i> <tt>pool</tt> is the result of a previous call to | 
|  | 1555 | <a href="runtime.objc_autoreleasePoolPush"><tt>objc_autoreleasePoolPush</tt></a> | 
|  | 1556 | on the current thread, where neither <tt>pool</tt> nor any enclosing | 
|  | 1557 | pool have previously been popped.</p> | 
|  | 1558 | <p>Releases all the objects added to the given autorelease pool and | 
|  | 1559 | any autorelease pools it encloses, then sets the current autorelease | 
|  | 1560 | pool to the pool directly enclosing <tt>pool</tt>.</p> | 
|  | 1561 | </div> <!-- runtime.objc_autoreleasePoolPop --> | 
|  | 1562 |  | 
|  | 1563 | <div id="runtime.objc_autoreleasePoolPush"> | 
|  | 1564 | <h1><tt>void *objc_autoreleasePoolPush(void);</tt></h1> | 
|  | 1565 | <p>Creates a new autorelease pool that is enclosed by the current | 
|  | 1566 | pool, makes that the current pool, and returns an opaque <q>handle</q> | 
|  | 1567 | to it.</p> | 
|  | 1568 |  | 
|  | 1569 | <div class="rationale"><p>Rationale: while the interface is described | 
|  | 1570 | as an explicit hierarchy of pools, the rules allow the implementation | 
|  | 1571 | to just keep a stack of objects, using the stack depth as the opaque | 
|  | 1572 | pool handle.</p></div> | 
|  | 1573 |  | 
|  | 1574 | </div> <!-- runtime.objc_autoreleasePoolPush --> | 
|  | 1575 |  | 
|  | 1576 | <div id="runtime.objc_autoreleaseReturnValue"> | 
|  | 1577 | <h1><tt>id objc_autoreleaseReturnValue(id value);</tt></h1> | 
|  | 1578 | <p><i>Precondition:</i> <tt>value</tt> is null or a pointer to a | 
|  | 1579 | valid object.</p> | 
|  | 1580 | <p>If <tt>value</tt> is null, this call has no effect.  Otherwise, it | 
|  | 1581 | makes a best effort to hand off ownership of a retain count on the | 
|  | 1582 | object to a call | 
|  | 1583 | to <a href="runtime.objc_retainAutoreleasedReturnValue"><tt>objc_retainAutoreleasedReturnValue</tt></a> | 
|  | 1584 | for the same object in an enclosing call frame.  If this is not | 
|  | 1585 | possible, the object is autoreleased as above.</p> | 
|  | 1586 | <p>Always returns <tt>value</tt>.</p> | 
|  | 1587 | </div> <!-- runtime.objc_autoreleaseReturnValue --> | 
|  | 1588 |  | 
|  | 1589 | <div id="runtime.objc_copyWeak"> | 
|  | 1590 | <h1><tt>void objc_copyWeak(id *dest, id *src);</tt></h1> | 
|  | 1591 | <p><i>Precondition:</i> <tt>src</tt> is a valid pointer which either | 
|  | 1592 | contains a null pointer or has been registered as a <tt>__weak</tt> | 
|  | 1593 | object.  <tt>dest</tt> is a valid pointer which has not been | 
|  | 1594 | registered as a <tt>__weak</tt> object.</p> | 
|  | 1595 | <p><tt>dest</tt> is initialized to be equivalent to <tt>src</tt>, | 
|  | 1596 | potentially registering it with the runtime.  Equivalent to the | 
|  | 1597 | following code:</p> | 
|  | 1598 | <pre>void objc_copyWeak(id *dest, id *src) { | 
|  | 1599 | objc_release(objc_initWeak(dest, objc_loadWeakRetained(src))); | 
|  | 1600 | }</pre> | 
|  | 1601 | <p>Must be atomic with respect to calls to <tt>objc_storeWeak</tt> | 
|  | 1602 | on <tt>src</tt>.</p> | 
|  | 1603 | </div> <!-- runtime.objc_copyWeak --> | 
|  | 1604 |  | 
|  | 1605 | <div id="runtime.objc_destroyWeak"> | 
|  | 1606 | <h1><tt>void objc_destroyWeak(id *object);</tt></h1> | 
|  | 1607 | <p><i>Precondition:</i> <tt>object</tt> is a valid pointer which | 
|  | 1608 | either contains a null pointer or has been registered as | 
|  | 1609 | a <tt>__weak</tt> object.</p> | 
|  | 1610 | <p><tt>object</tt> is unregistered as a weak object, if it ever was. | 
|  | 1611 | The current value of <tt>object</tt> is left unspecified; otherwise, | 
|  | 1612 | equivalent to the following code:</p> | 
|  | 1613 | <pre>void objc_destroyWeak(id *object) { | 
|  | 1614 | objc_storeWeak(object, nil); | 
|  | 1615 | }</pre> | 
|  | 1616 | <p>Does not need to be atomic with respect to calls | 
|  | 1617 | to <tt>objc_storeWeak</tt> on <tt>object</tt>.</p> | 
|  | 1618 | </div> <!-- runtime.objc_destroyWeak --> | 
|  | 1619 |  | 
|  | 1620 | <div id="runtime.objc_initWeak"> | 
|  | 1621 | <h1><tt>id objc_initWeak(id *object, id value);</tt></h1> | 
|  | 1622 | <p><i>Precondition:</i> <tt>object</tt> is a valid pointer which has | 
|  | 1623 | not been registered as a <tt>__weak</tt> object.  <tt>value</tt> is | 
|  | 1624 | null or a pointer to a valid object.</p> | 
|  | 1625 | <p>If <tt>value</tt> is a null pointer or the object to which it | 
|  | 1626 | points has begun deallocation, <tt>object</tt> is zero-initialized. | 
|  | 1627 | Otherwise, <tt>object</tt> is registered as a <tt>__weak</tt> object | 
|  | 1628 | pointing to <tt>value</tt>.  Equivalent to the following code:</p> | 
|  | 1629 | <pre>id objc_initWeak(id *object, id value) { | 
|  | 1630 | *object = nil; | 
|  | 1631 | return objc_storeWeak(object, value); | 
|  | 1632 | }</pre> | 
|  | 1633 | <p>Returns the value of <tt>object</tt> after the call.</p> | 
|  | 1634 | <p>Does not need to be atomic with respect to calls | 
|  | 1635 | to <tt>objc_storeWeak</tt> on <tt>object</tt>.</p> | 
|  | 1636 | </div> <!-- runtime.objc_initWeak --> | 
|  | 1637 |  | 
|  | 1638 | <div id="runtime.objc_loadWeak"> | 
|  | 1639 | <h1><tt>id objc_loadWeak(id *object);</tt></h1> | 
|  | 1640 | <p><i>Precondition:</i> <tt>object</tt> is a valid pointer which | 
|  | 1641 | either contains a null pointer or has been registered as | 
|  | 1642 | a <tt>__weak</tt> object.</p> | 
|  | 1643 | <p>If <tt>object</tt> is registered as a <tt>__weak</tt> object, and | 
|  | 1644 | the last value stored into <tt>object</tt> has not yet been | 
|  | 1645 | deallocated or begun deallocation, retains and autoreleases that value | 
|  | 1646 | and returns it.  Otherwise returns null.  Equivalent to the following | 
|  | 1647 | code:</p> | 
|  | 1648 | <pre>id objc_loadWeak(id *object) { | 
|  | 1649 | return objc_autorelease(objc_loadWeakRetained(object)); | 
|  | 1650 | }</pre> | 
|  | 1651 | <p>Must be atomic with respect to calls to <tt>objc_storeWeak</tt> | 
|  | 1652 | on <tt>object</tt>.</p> | 
|  | 1653 | <div class="rationale">Rationale: loading weak references would be | 
|  | 1654 | inherently prone to race conditions without the retain.</div> | 
|  | 1655 | </div> <!-- runtime.objc_loadWeak --> | 
|  | 1656 |  | 
|  | 1657 | <div id="runtime.objc_loadWeakRetained"> | 
|  | 1658 | <h1><tt>id objc_loadWeakRetained(id *object);</tt></h1> | 
|  | 1659 | <p><i>Precondition:</i> <tt>object</tt> is a valid pointer which | 
|  | 1660 | either contains a null pointer or has been registered as | 
|  | 1661 | a <tt>__weak</tt> object.</p> | 
|  | 1662 | <p>If <tt>object</tt> is registered as a <tt>__weak</tt> object, and | 
|  | 1663 | the last value stored into <tt>object</tt> has not yet been | 
|  | 1664 | deallocated or begun deallocation, retains that value and returns it. | 
|  | 1665 | Otherwise returns null.</p> | 
|  | 1666 | <p>Must be atomic with respect to calls to <tt>objc_storeWeak</tt> | 
|  | 1667 | on <tt>object</tt>.</p> | 
|  | 1668 | </div> <!-- runtime.objc_loadWeakRetained --> | 
|  | 1669 |  | 
|  | 1670 | <div id="runtime.objc_moveWeak"> | 
|  | 1671 | <h1><tt>void objc_moveWeak(id *dest, id *src);</tt></h1> | 
|  | 1672 | <p><i>Precondition:</i> <tt>src</tt> is a valid pointer which either | 
|  | 1673 | contains a null pointer or has been registered as a <tt>__weak</tt> | 
|  | 1674 | object.  <tt>dest</tt> is a valid pointer which has not been | 
|  | 1675 | registered as a <tt>__weak</tt> object.</p> | 
|  | 1676 | <p><tt>dest</tt> is initialized to be equivalent to <tt>src</tt>, | 
|  | 1677 | potentially registering it with the runtime.  <tt>src</tt> may then be | 
|  | 1678 | left in its original state, in which case this call is equivalent | 
|  | 1679 | to <a href="#runtime.objc_copyWeak"><tt>objc_copyWeak</tt></a>, or it | 
|  | 1680 | may be left as null.</p> | 
|  | 1681 | <p>Must be atomic with respect to calls to <tt>objc_storeWeak</tt> | 
|  | 1682 | on <tt>src</tt>.</p> | 
|  | 1683 | </div> <!-- runtime.objc_moveWeak --> | 
|  | 1684 |  | 
| John McCall | 085d09d | 2011-06-19 10:12:24 +0000 | [diff] [blame] | 1685 | <div id="runtime.objc_release"> | 
|  | 1686 | <h1><tt>void objc_release(id value);</tt></h1> | 
|  | 1687 | <p><i>Precondition:</i> <tt>value</tt> is null or a pointer to a | 
|  | 1688 | valid object.</p> | 
|  | 1689 | <p>If <tt>value</tt> is null, this call has no effect.  Otherwise, it | 
|  | 1690 | performs a release operation exactly as if the object had been sent | 
|  | 1691 | the <tt>release</tt> message.</p> | 
|  | 1692 | </div> <!-- runtime.objc_release --> | 
|  | 1693 |  | 
| John McCall | 98a48cf | 2011-06-19 09:36:02 +0000 | [diff] [blame] | 1694 | <div id="runtime.objc_retain"> | 
|  | 1695 | <h1><tt>id objc_retain(id value);</tt></h1> | 
|  | 1696 | <p><i>Precondition:</i> <tt>value</tt> is null or a pointer to a | 
|  | 1697 | valid object.</p> | 
|  | 1698 | <p>If <tt>value</tt> is null, this call has no effect.  Otherwise, it | 
|  | 1699 | performs a retain operation exactly as if the object had been sent | 
|  | 1700 | the <tt>retain</tt> message.</p> | 
|  | 1701 | <p>Always returns <tt>value</tt>.</p> | 
|  | 1702 | </div> <!-- runtime.objc_retain --> | 
|  | 1703 |  | 
|  | 1704 | <div id="runtime.objc_retainAutorelease"> | 
|  | 1705 | <h1><tt>id objc_retainAutorelease(id value);</tt></h1> | 
|  | 1706 | <p><i>Precondition:</i> <tt>value</tt> is null or a pointer to a | 
|  | 1707 | valid object.</p> | 
|  | 1708 | <p>If <tt>value</tt> is null, this call has no effect.  Otherwise, it | 
|  | 1709 | performs a retain operation followed by an autorelease operation. | 
|  | 1710 | Equivalent to the following code:</p> | 
|  | 1711 | <pre>id objc_retainAutorelease(id value) { | 
|  | 1712 | return objc_autorelease(objc_retain(value)); | 
|  | 1713 | }</pre> | 
|  | 1714 | <p>Always returns <tt>value</tt>.</p> | 
|  | 1715 | </div> <!-- runtime.objc_retainAutorelease --> | 
|  | 1716 |  | 
|  | 1717 | <div id="runtime.objc_retainAutoreleaseReturnValue"> | 
|  | 1718 | <h1><tt>id objc_retainAutoreleaseReturnValue(id value);</tt></h1> | 
|  | 1719 | <p><i>Precondition:</i> <tt>value</tt> is null or a pointer to a | 
|  | 1720 | valid object.</p> | 
|  | 1721 | <p>If <tt>value</tt> is null, this call has no effect.  Otherwise, it | 
|  | 1722 | performs a retain operation followed by the operation described in | 
|  | 1723 | <a href="#runtime.objc_autoreleaseReturnValue"><tt>objc_autoreleaseReturnValue</tt></a>. | 
|  | 1724 | Equivalent to the following code:</p> | 
|  | 1725 | <pre>id objc_retainAutoreleaseReturnValue(id value) { | 
|  | 1726 | return objc_autoreleaseReturnValue(objc_retain(value)); | 
|  | 1727 | }</pre> | 
|  | 1728 | <p>Always returns <tt>value</tt>.</p> | 
|  | 1729 | </div> <!-- runtime.objc_retainAutoreleaseReturnValue --> | 
|  | 1730 |  | 
|  | 1731 | <div id="runtime.objc_retainAutoreleasedReturnValue"> | 
|  | 1732 | <h1><tt>id objc_retainAutoreleasedReturnValue(id value);</tt></h1> | 
|  | 1733 | <p><i>Precondition:</i> <tt>value</tt> is null or a pointer to a | 
|  | 1734 | valid object.</p> | 
|  | 1735 | <p>If <tt>value</tt> is null, this call has no effect.  Otherwise, it | 
|  | 1736 | attempts to accept a hand off of a retain count from a call to | 
|  | 1737 | <a href="#runtime.objc_autoreleaseReturnValue"><tt>objc_autoreleaseReturnValue</tt></a> | 
|  | 1738 | on <tt>value</tt> in a recently-called function or something it | 
|  | 1739 | calls.  If that fails, it performs a retain operation exactly | 
|  | 1740 | like <a href="#runtime.objc_retain"><tt>objc_retain</tt></a>.</p> | 
|  | 1741 | <p>Always returns <tt>value</tt>.</p> | 
|  | 1742 | </div> <!-- runtime.objc_retainAutoreleasedReturnValue --> | 
|  | 1743 |  | 
|  | 1744 | <div id="runtime.objc_retainBlock"> | 
|  | 1745 | <h1><tt>id objc_retainBlock(id value);</tt></h1> | 
|  | 1746 | <p><i>Precondition:</i> <tt>value</tt> is null or a pointer to a | 
|  | 1747 | valid block object.</p> | 
|  | 1748 | <p>If <tt>value</tt> is null, this call has no effect.  Otherwise, if | 
|  | 1749 | the block pointed to by <tt>value</tt> is still on the stack, it is | 
|  | 1750 | copied to the heap and the address of the copy is returned.  Otherwise | 
|  | 1751 | a retain operation is performed on the block exactly as if it had been | 
|  | 1752 | sent the <tt>retain</tt> message.</p> | 
|  | 1753 | </div> <!-- runtime.objc_retainBlock --> | 
|  | 1754 |  | 
| John McCall | 98a48cf | 2011-06-19 09:36:02 +0000 | [diff] [blame] | 1755 | <div id="runtime.objc_storeStrong"> | 
|  | 1756 | <h1><tt>id objc_storeStrong(id *object, id value);</tt></h1> | 
|  | 1757 | <p><i>Precondition:</i> <tt>object</tt> is a valid pointer to | 
|  | 1758 | a <tt>__strong</tt> object which is adequately aligned for a | 
|  | 1759 | pointer.  <tt>value</tt> is null or a pointer to a valid object.</p> | 
|  | 1760 | <p>Performs the complete sequence for assigning to a <tt>__strong</tt> | 
|  | 1761 | object of non-block type.  Equivalent to the following code:</p> | 
|  | 1762 | <pre>id objc_storeStrong(id *object, id value) { | 
|  | 1763 | value = [value retain]; | 
|  | 1764 | id oldValue = *object; | 
|  | 1765 | *object = value; | 
|  | 1766 | [oldValue release]; | 
|  | 1767 | return value; | 
|  | 1768 | }</pre> | 
|  | 1769 | <p>Always returns <tt>value</tt>.</p> | 
|  | 1770 | </div> <!-- runtime.objc_storeStrong --> | 
|  | 1771 |  | 
|  | 1772 | <div id="runtime.objc_storeWeak"> | 
|  | 1773 | <h1><tt>id objc_storeWeak(id *object, id value);</tt></h1> | 
|  | 1774 | <p><i>Precondition:</i> <tt>object</tt> is a valid pointer which | 
|  | 1775 | either contains a null pointer or has been registered as | 
|  | 1776 | a <tt>__weak</tt> object.  <tt>value</tt> is null or a pointer to a | 
|  | 1777 | valid object.</p> | 
|  | 1778 | <p>If <tt>value</tt> is a null pointer or the object to which it | 
|  | 1779 | points has begun deallocation, <tt>object</tt> is assigned null | 
|  | 1780 | and unregistered as a <tt>__weak</tt> object.  Otherwise, | 
|  | 1781 | <tt>object</tt> is registered as a <tt>__weak</tt> object or has its | 
|  | 1782 | registration updated to point to <tt>value</tt>.</p> | 
|  | 1783 | <p>Returns the value of <tt>object</tt> after the call.</p> | 
|  | 1784 | </div> <!-- runtime.objc_storeWeak --> | 
|  | 1785 |  | 
|  | 1786 | </div> <!-- runtime --> | 
| John McCall | 8246702 | 2011-06-15 21:21:53 +0000 | [diff] [blame] | 1787 | </div> <!-- root --> | 
|  | 1788 | </body> | 
|  | 1789 | </html> |