aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/AutomaticReferenceCounting.html2226
-rw-r--r--docs/AutomaticReferenceCounting.rst2061
2 files changed, 2061 insertions, 2226 deletions
diff --git a/docs/AutomaticReferenceCounting.html b/docs/AutomaticReferenceCounting.html
deleted file mode 100644
index 5354f8af34..0000000000
--- a/docs/AutomaticReferenceCounting.html
+++ /dev/null
@@ -1,2226 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
-<title>Objective-C Automatic Reference Counting (ARC)</title>
-<link type="text/css" rel="stylesheet" href="../menu.css">
-<link type="text/css" rel="stylesheet" href="../content.css">
-<style type="text/css">
-/* Collapse the items in the ToC to the left. */
-div#toc ul {
- padding-left: 0
-}
-
-/* Rationales appear in italic. */
-div.rationale {
- font-style: italic
-}
-
-div.rationale em {
- font-style: normal
-}
-
-/* Revisions are also italicized. */
-span.revision {
- font-style: italic
-}
-
-span.whenRevised {
- font-weight: bold;
- font-style: normal
-}
-
-div h1 { font-size: 2em; margin: .67em 0 }
-div div h1 { font-size: 1.5em; margin: .75em 0 }
-div div div h1 { font-size: 1.17em; margin: .83em 0 }
-div div div div h1 { margin: 1.12em 0 }
-
-span.term { font-style: italic; font-weight: bold }
-</style>
-
-<script type="text/javascript">
-/// A little script to recursively build a table of contents.
-function buildTOC(div, toc, ancestry) {
- var children = div.childNodes;
- var len = children.length;
-
- var childNumber = 0;
-
- var list = null;
- for (var i = 0; i < len; ++i) {
- var child = children[i];
- if (child.nodeName != "DIV") continue;
- if (child.getAttribute("class") == "rationale") continue;
- if (child.id == "toc") continue;
-
- // Okay, we're actually going to build a list node.
- if (list === null) list = document.createElement("ul");
-
- var childAncestry = ancestry + ++childNumber + ".";
-
- var headerNode = child.childNodes[1];
- var title = headerNode.innerHTML;
- headerNode.insertBefore(document.createTextNode(childAncestry + " "),
- headerNode.firstChild);
-
- var item = document.createElement("li");
- item.appendChild(document.createTextNode(childAncestry + " "));
-
- var anchor = document.createElement("a");
- anchor.href = "#" + child.id;
- anchor.innerHTML = title;
- item.appendChild(anchor);
-
- buildTOC(child, item, childAncestry);
-
- list.appendChild(item);
- }
- if (list) toc.appendChild(list);
-}
-
-function onLoad() {
- var toc = document.getElementById("toc");
- var content = document.getElementById("content");
- buildTOC(content, toc, "");
-}
-window.onload = onLoad;
-
-</script>
-</head>
-<body>
-
-<!--#include virtual="../menu.html.incl"-->
-
-<div id="content">
-<h1>Automatic Reference Counting</h1>
-
-<div id="toc">
-</div>
-
-<div id="meta">
-<h1>About this document</h1>
-
-<div id="meta.purpose">
-<h1>Purpose</h1>
-
-<p>The first and primary purpose of this document is to serve as a
-complete technical specification of Automatic Reference Counting.
-Given a core Objective-C compiler and runtime, it should be possible
-to write a compiler and runtime which implements these new
-semantics.</p>
-
-<p>The secondary purpose is to act as a rationale for why ARC was
-designed in this way. This should remain tightly focused on the
-technical design and should not stray into marketing speculation.</p>
-
-</div> <!-- meta.purpose -->
-
-<div id="meta.background">
-<h1>Background</h1>
-
-<p>This document assumes a basic familiarity with C.</p>
-
-<p><span class="term">Blocks</span> are a C language extension for
-creating anonymous functions. Users interact with and transfer block
-objects using <span class="term">block pointers</span>, which are
-represented like a normal pointer. A block may capture values from
-local variables; when this occurs, memory must be dynamically
-allocated. The initial allocation is done on the stack, but the
-runtime provides a <tt>Block_copy</tt> function which, given a block
-pointer, either copies the underlying block object to the heap,
-setting its reference count to 1 and returning the new block pointer,
-or (if the block object is already on the heap) increases its
-reference count by 1. The paired function is <tt>Block_release</tt>,
-which decreases the reference count by 1 and destroys the object if
-the count reaches zero and is on the heap.</p>
-
-<p>Objective-C is a set of language extensions, significant enough to
-be considered a different language. It is a strict superset of C.
-The extensions can also be imposed on C++, producing a language called
-Objective-C++. The primary feature is a single-inheritance object
-system; we briefly describe the modern dialect.</p>
-
-<p>Objective-C defines a new type kind, collectively called
-the <span class="term">object pointer types</span>. This kind has two
-notable builtin members, <tt>id</tt> and <tt>Class</tt>; <tt>id</tt>
-is the final supertype of all object pointers. The validity of
-conversions between object pointer types is not checked at runtime.
-Users may define <span class="term">classes</span>; each class is a
-type, and the pointer to that type is an object pointer type. A class
-may have a superclass; its pointer type is a subtype of its
-superclass's pointer type. A class has a set
-of <span class="term">ivars</span>, fields which appear on all
-instances of that class. For every class <i>T</i> there's an
-associated metaclass; it has no fields, its superclass is the
-metaclass of <i>T</i>'s superclass, and its metaclass is a global
-class. Every class has a global object whose class is the
-class's metaclass; metaclasses have no associated type, so pointers to
-this object have type <tt>Class</tt>.</p>
-
-<p>A class declaration (<tt>@interface</tt>) declares a set
-of <span class="term">methods</span>. A method has a return type, a
-list of argument types, and a <span class="term">selector</span>: a
-name like <tt>foo:bar:baz:</tt>, where the number of colons
-corresponds to the number of formal arguments. A method may be an
-instance method, in which case it can be invoked on objects of the
-class, or a class method, in which case it can be invoked on objects
-of the metaclass. A method may be invoked by providing an object
-(called the <span class="term">receiver</span>) and a list of formal
-arguments interspersed with the selector, like so:</p>
-
-<pre>[receiver foo: fooArg bar: barArg baz: bazArg]</pre>
-
-<p>This looks in the dynamic class of the receiver for a method with
-this name, then in that class's superclass, etc., until it finds
-something it can execute. The receiver <q>expression</q> may also be
-the name of a class, in which case the actual receiver is the class
-object for that class, or (within method definitions) it may
-be <tt>super</tt>, in which case the lookup algorithm starts with the
-static superclass instead of the dynamic class. The actual methods
-dynamically found in a class are not those declared in the
-<tt>@interface</tt>, but those defined in a separate
-<tt>@implementation</tt> declaration; however, when compiling a
-call, typechecking is done based on the methods declared in the
-<tt>@interface</tt>.</p>
-
-<p>Method declarations may also be grouped into
-<span class="term">protocols</span>, which are not inherently
-associated with any class, but which classes may claim to follow.
-Object pointer types may be qualified with additional protocols that
-the object is known to support.</p>
-
-<p><span class="term">Class extensions</span> are collections of ivars
-and methods, designed to allow a class's <tt>@interface</tt> to be
-split across multiple files; however, there is still a primary
-implementation file which must see the <tt>@interface</tt>s of all
-class extensions.
-<span class="term">Categories</span> allow methods (but not ivars) to
-be declared <i>post hoc</i> on an arbitrary class; the methods in the
-category's <tt>@implementation</tt> will be dynamically added to that
-class's method tables which the category is loaded at runtime,
-replacing those methods in case of a collision.</p>
-
-<p>In the standard environment, objects are allocated on the heap, and
-their lifetime is manually managed using a reference count. This is
-done using two instance methods which all classes are expected to
-implement: <tt>retain</tt> increases the object's reference count by
-1, whereas <tt>release</tt> decreases it by 1 and calls the instance
-method <tt>dealloc</tt> if the count reaches 0. To simplify certain
-operations, there is also an <span class="term">autorelease
-pool</span>, a thread-local list of objects to call <tt>release</tt>
-on later; an object can be added to this pool by
-calling <tt>autorelease</tt> on it.</p>
-
-<p>Block pointers may be converted to type <tt>id</tt>; block objects
-are laid out in a way that makes them compatible with Objective-C
-objects. There is a builtin class that all block objects are
-considered to be objects of; this class implements <tt>retain</tt> by
-adjusting the reference count, not by calling <tt>Block_copy</tt>.</p>
-
-</div> <!-- meta.background -->
-
-<div id="meta.evolution">
-<h1>Evolution</h1>
-
-<p>ARC is under continual evolution, and this document must be updated
-as the language progresses.</p>
-
-<p>If a change increases the expressiveness of the language, for
-example by lifting a restriction or by adding new syntax, the change
-will be annotated with a revision marker, like so:</p>
-
-<blockquote>
- ARC applies to Objective-C pointer types, block pointer types, and
- <span class="revision"><span class="whenRevised">[beginning Apple
- 8.0, LLVM 3.8]</span> BPTRs declared within <code>extern
- "BCPL"</code> blocks</span>.
-</blockquote>
-
-<p>For now, it is sensible to version this document by the releases of
-its sole implementation (and its host project), clang.
-<q>LLVM X.Y</q> refers to an open-source release of clang from the
-LLVM project. <q>Apple X.Y</q> refers to an Apple-provided release of
-the Apple LLVM Compiler. Other organizations that prepare their own,
-separately-versioned clang releases and wish to maintain similar
-information in this document should send requests to cfe-dev.</p>
-
-<p>If a change decreases the expressiveness of the language, for
-example by imposing a new restriction, this should be taken as an
-oversight in the original specification and something to be avoided
-in all versions. Such changes are generally to be avoided.</p>
-
-</div> <!-- meta.evolution -->
-
-</div> <!-- meta -->
-
-<div id="general">
-<h1>General</h1>
-
-<p>Automatic Reference Counting implements automatic memory management
-for Objective-C objects and blocks, freeing the programmer from the
-need to explicitly insert retains and releases. It does not provide a
-cycle collector; users must explicitly manage the lifetime of their
-objects, breaking cycles manually or with weak or unsafe
-references.</p>
-
-<p>ARC may be explicitly enabled with the compiler
-flag <tt>-fobjc-arc</tt>. It may also be explicitly disabled with the
-compiler flag <tt>-fno-objc-arc</tt>. The last of these two flags
-appearing on the compile line <q>wins</q>.</p>
-
-<p>If ARC is enabled, <tt>__has_feature(objc_arc)</tt> will expand to
-1 in the preprocessor. For more information about <tt>__has_feature</tt>,
-see the <a href="LanguageExtensions.html#__has_feature_extension">language
-extensions</a> document.</p>
-
-</div> <!-- general -->
-
-<div id="objects">
-<h1>Retainable object pointers</h1>
-
-<p>This section describes retainable object pointers, their basic
-operations, and the restrictions imposed on their use under ARC. Note
-in particular that it covers the rules for pointer <em>values</em>
-(patterns of bits indicating the location of a pointed-to object), not
-pointer
-<em>objects</em> (locations in memory which store pointer values).
-The rules for objects are covered in the next section.</p>
-
-<p>A <span class="term">retainable object pointer</span>
-(or <q>retainable pointer</q>) is a value of
-a <span class="term">retainable object pointer type</span>
-(<q>retainable type</q>). There are three kinds of retainable object
-pointer types:</p>
-<ul>
-<li>block pointers (formed by applying the caret (<tt>^</tt>)
-declarator sigil to a function type)</li>
-<li>Objective-C object pointers (<tt>id</tt>, <tt>Class</tt>, <tt>NSFoo*</tt>, etc.)</li>
-<li>typedefs marked with <tt>__attribute__((NSObject))</tt></li>
-</ul>
-
-<p>Other pointer types, such as <tt>int*</tt> and <tt>CFStringRef</tt>,
-are not subject to ARC's semantics and restrictions.</p>
-
-<div class="rationale">
-
-<p>Rationale: We are not at liberty to require
-all code to be recompiled with ARC; therefore, ARC must interoperate
-with Objective-C code which manages retains and releases manually. In
-general, there are three requirements in order for a
-compiler-supported reference-count system to provide reliable
-interoperation:</p>
-
-<ul>
-<li>The type system must reliably identify which objects are to be
-managed. An <tt>int*</tt> might be a pointer to a <tt>malloc</tt>'ed
-array, or it might be an interior pointer to such an array, or it might
-point to some field or local variable. In contrast, values of the
-retainable object pointer types are never interior.</li>
-<li>The type system must reliably indicate how to
-manage objects of a type. This usually means that the type must imply
-a procedure for incrementing and decrementing retain counts.
-Supporting single-ownership objects requires a lot more explicit
-mediation in the language.</li>
-<li>There must be reliable conventions for whether and
-when <q>ownership</q> is passed between caller and callee, for both
-arguments and return values. Objective-C methods follow such a
-convention very reliably, at least for system libraries on Mac OS X,
-and functions always pass objects at +0. The C-based APIs for Core
-Foundation objects, on the other hand, have much more varied transfer
-semantics.</li>
-</ul>
-</div> <!-- rationale -->
-
-<p>The use of <tt>__attribute__((NSObject))</tt> typedefs is not
-recommended. If it's absolutely necessary to use this attribute, be
-very explicit about using the typedef, and do not assume that it will
-be preserved by language features like <tt>__typeof</tt> and C++
-template argument substitution.</p>
-
-<div class="rationale"><p>Rationale: any compiler operation which
-incidentally strips type <q>sugar</q> from a type will yield a type
-without the attribute, which may result in unexpected
-behavior.</p></div>
-
-<div id="objects.retains">
-<h1>Retain count semantics</h1>
-
-<p>A retainable object pointer is either a <span class="term">null
-pointer</span> or a pointer to a valid object. Furthermore, if it has
-block pointer type and is not <tt>null</tt> then it must actually be a
-pointer to a block object, and if it has <tt>Class</tt> type (possibly
-protocol-qualified) then it must actually be a pointer to a class
-object. Otherwise ARC does not enforce the Objective-C type system as
-long as the implementing methods follow the signature of the static
-type. It is undefined behavior if ARC is exposed to an invalid
-pointer.</p>
-
-<p>For ARC's purposes, a valid object is one with <q>well-behaved</q>
-retaining operations. Specifically, the object must be laid out such
-that the Objective-C message send machinery can successfully send it
-the following messages:</p>
-
-<ul>
-<li><tt>retain</tt>, taking no arguments and returning a pointer to
-the object.</li>
-<li><tt>release</tt>, taking no arguments and returning <tt>void</tt>.</li>
-<li><tt>autorelease</tt>, taking no arguments and returning a pointer
-to the object.</li>
-</ul>
-
-<p>The behavior of these methods is constrained in the following ways.
-The term <span class="term">high-level semantics</span> is an
-intentionally vague term; the intent is that programmers must
-implement these methods in a way such that the compiler, modifying
-code in ways it deems safe according to these constraints, will not
-violate their requirements. For example, if the user puts logging
-statements in <tt>retain</tt>, they should not be surprised if those
-statements are executed more or less often depending on optimization
-settings. These constraints are not exhaustive of the optimization
-opportunities: values held in local variables are subject to
-additional restrictions, described later in this document.</p>
-
-<p>It is undefined behavior if a computation history featuring a send
-of <tt>retain</tt> followed by a send of <tt>release</tt> to the same
-object, with no intervening <tt>release</tt> on that object, is not
-equivalent under the high-level semantics to a computation
-history in which these sends are removed. Note that this implies that
-these methods may not raise exceptions.</p>
-
-<p>It is undefined behavior if a computation history features any use
-whatsoever of an object following the completion of a send
-of <tt>release</tt> that is not preceded by a send of <tt>retain</tt>
-to the same object.</p>
-
-<p>The behavior of <tt>autorelease</tt> must be equivalent to sending
-<tt>release</tt> when one of the autorelease pools currently in scope
-is popped. It may not throw an exception.</p>
-
-<p>When the semantics call for performing one of these operations on a
-retainable object pointer, if that pointer is <tt>null</tt> then the
-effect is a no-op.</p>
-
-<p>All of the semantics described in this document are subject to
-additional <a href="#optimization">optimization rules</a> which permit
-the removal or optimization of operations based on local knowledge of
-data flow. The semantics describe the high-level behaviors that the
-compiler implements, not an exact sequence of operations that a
-program will be compiled into.</p>
-
-</div> <!-- objects.retains -->
-
-<div id="objects.operands">
-<h1>Retainable object pointers as operands and arguments</h1>
-
-<p>In general, ARC does not perform retain or release operations when
-simply using a retainable object pointer as an operand within an
-expression. This includes:</p>
-<ul>
-<li>loading a retainable pointer from an object with non-weak
-<a href="#ownership">ownership</a>,</li>
-<li>passing a retainable pointer as an argument to a function or
-method, and</li>
-<li>receiving a retainable pointer as the result of a function or
-method call.</li>
-</ul>
-
-<div class="rationale"><p>Rationale: while this might seem
-uncontroversial, it is actually unsafe when multiple expressions are
-evaluated in <q>parallel</q>, as with binary operators and calls,
-because (for example) one expression might load from an object while
-another writes to it. However, C and C++ already call this undefined
-behavior because the evaluations are unsequenced, and ARC simply
-exploits that here to avoid needing to retain arguments across a large
-number of calls.</p></div>
-
-<p>The remainder of this section describes exceptions to these rules,
-how those exceptions are detected, and what those exceptions imply
-semantically.</p>
-
-<div id="objects.operands.consumed">
-<h1>Consumed parameters</h1>
-
-<p>A function or method parameter of retainable object pointer type
-may be marked as <span class="term">consumed</span>, signifying that
-the callee expects to take ownership of a +1 retain count. This is
-done by adding the <tt>ns_consumed</tt> attribute to the parameter
-declaration, like so:</p>
-
-<pre>void foo(__attribute((ns_consumed)) id x);
-- (void) foo: (id) __attribute((ns_consumed)) x;</pre>
-
-<p>This attribute is part of the type of the function or method, not
-the type of the parameter. It controls only how the argument is
-passed and received.</p>
-
-<p>When passing such an argument, ARC retains the argument prior to
-making the call.</p>
-
-<p>When receiving such an argument, ARC releases the argument at the
-end of the function, subject to the usual optimizations for local
-values.</p>
-
-<div class="rationale"><p>Rationale: this formalizes direct transfers
-of ownership from a caller to a callee. The most common scenario here
-is passing the <tt>self</tt> parameter to <tt>init</tt>, but it is
-useful to generalize. Typically, local optimization will remove any
-extra retains and releases: on the caller side the retain will be
-merged with a +1 source, and on the callee side the release will be
-rolled into the initialization of the parameter.</p></div>
-
-<p>The implicit <tt>self</tt> parameter of a method may be marked as
-consumed by adding <tt>__attribute__((ns_consumes_self))</tt> to the
-method declaration. Methods in the <tt>init</tt>
-<a href="#family">family</a> are treated as if they were implicitly
-marked with this attribute.</p>
-
-<p>It is undefined behavior if an Objective-C message send to a method
-with <tt>ns_consumed</tt> parameters (other than self) is made with a
-null receiver. It is undefined behavior if the method to which an
-Objective-C message send statically resolves to has a different set
-of <tt>ns_consumed</tt> parameters than the method it dynamically
-resolves to. It is undefined behavior if a block or function call is
-made through a static type with a different set of <tt>ns_consumed</tt>
-parameters than the implementation of the called block or function.</p>
-
-<div class="rationale"><p>Rationale: consumed parameters with null
-receiver are a guaranteed leak. Mismatches with consumed parameters
-will cause over-retains or over-releases, depending on the direction.
-The rule about function calls is really just an application of the
-existing C/C++ rule about calling functions through an incompatible
-function type, but it's useful to state it explicitly.</p></div>
-
-</div> <!-- objects.operands.consumed -->
-
-<div id="objects.operands.retained-returns">
-<h1>Retained return values</h1>
-
-<p>A function or method which returns a retainable object pointer type
-may be marked as returning a retained value, signifying that the
-caller expects to take ownership of a +1 retain count. This is done
-by adding the <tt>ns_returns_retained</tt> attribute to the function or
-method declaration, like so:</p>
-
-<pre>id foo(void) __attribute((ns_returns_retained));
-- (id) foo __attribute((ns_returns_retained));</pre>
-
-<p>This attribute is part of the type of the function or method.</p>
-
-<p>When returning from such a function or method, ARC retains the
-value at the point of evaluation of the return statement, before
-leaving all local scopes.</p>
-
-<p>When receiving a return result from such a function or method, ARC
-releases the value at the end of the full-expression it is contained
-within, subject to the usual optimizations for local values.</p>
-
-<div class="rationale"><p>Rationale: this formalizes direct transfers of
-ownership from a callee to a caller. The most common scenario this
-models is the retained return from <tt>init</tt>, <tt>alloc</tt>,
-<tt>new</tt>, and <tt>copy</tt> methods, but there are other cases in
-the frameworks. After optimization there are typically no extra
-retains and releases required.</p></div>
-
-<p>Methods in
-the <tt>alloc</tt>, <tt>copy</tt>, <tt>init</tt>, <tt>mutableCopy</tt>,
-and <tt>new</tt> <a href="#family">families</a> are implicitly marked
-<tt>__attribute__((ns_returns_retained))</tt>. This may be suppressed
-by explicitly marking the
-method <tt>__attribute__((ns_returns_not_retained))</tt>.</p>
-
-<p>It is undefined behavior if the method to which an Objective-C
-message send statically resolves has different retain semantics on its
-result from the method it dynamically resolves to. It is undefined
-behavior if a block or function call is made through a static type
-with different retain semantics on its result from the implementation
-of the called block or function.</p>
-
-<div class="rationale"><p>Rationale: Mismatches with returned results
-will cause over-retains or over-releases, depending on the direction.
-Again, the rule about function calls is really just an application of
-the existing C/C++ rule about calling functions through an
-incompatible function type.</p></div>
-
-</div> <!-- objects.operands.retained-returns -->
-
-<div id="objects.operands.other-returns">
-<h1>Unretained return values</h1>
-
-<p>A method or function which returns a retainable object type but
-does not return a retained value must ensure that the object is
-still valid across the return boundary.</p>
-
-<p>When returning from such a function or method, ARC retains the
-value at the point of evaluation of the return statement, then leaves
-all local scopes, and then balances out the retain while ensuring that
-the value lives across the call boundary. In the worst case, this may
-involve an <tt>autorelease</tt>, but callers must not assume that the
-value is actually in the autorelease pool.</p>
-
-<p>ARC performs no extra mandatory work on the caller side, although
-it may elect to do something to shorten the lifetime of the returned
-value.</p>
-
-<div class="rationale"><p>Rationale: it is common in non-ARC code to not
-return an autoreleased value; therefore the convention does not force
-either path. It is convenient to not be required to do unnecessary
-retains and autoreleases; this permits optimizations such as eliding
-retain/autoreleases when it can be shown that the original pointer
-will still be valid at the point of return.</p></div>
-
-<p>A method or function may be marked
-with <tt>__attribute__((ns_returns_autoreleased))</tt> to indicate
-that it returns a pointer which is guaranteed to be valid at least as
-long as the innermost autorelease pool. There are no additional
-semantics enforced in the definition of such a method; it merely
-enables optimizations in callers.</p>
-
-</div> <!-- objects.operands.other-returns -->
-
-<div id="objects.operands.casts">
-<h1>Bridged casts</h1>
-
-<p>A <span class="term">bridged cast</span> is a C-style cast
-annotated with one of three keywords:</p>
-
-<ul>
-<li><tt>(__bridge T) op</tt> casts the operand to the destination
-type <tt>T</tt>. If <tt>T</tt> is a retainable object pointer type,
-then <tt>op</tt> must have a non-retainable pointer type.
-If <tt>T</tt> is a non-retainable pointer type, then <tt>op</tt> must
-have a retainable object pointer type. Otherwise the cast is
-ill-formed. There is no transfer of ownership, and ARC inserts
-no retain operations.</li>
-
-<li><tt>(__bridge_retained T) op</tt> casts the operand, which must
-have retainable object pointer type, to the destination type, which
-must be a non-retainable pointer type. ARC retains the value, subject
-to the usual optimizations on local values, and the recipient is
-responsible for balancing that +1.</li>
-
-<li><tt>(__bridge_transfer T) op</tt> casts the operand, which must
-have non-retainable pointer type, to the destination type, which must
-be a retainable object pointer type. ARC will release the value at
-the end of the enclosing full-expression, subject to the usual
-optimizations on local values.</li>
-</ul>
-
-<p>These casts are required in order to transfer objects in and out of
-ARC control; see the rationale in the section
-on <a href="#objects.restrictions.conversion">conversion of retainable
-object pointers</a>.</p>
-
-<p>Using a <tt>__bridge_retained</tt> or <tt>__bridge_transfer</tt>
-cast purely to convince ARC to emit an unbalanced retain or release,
-respectively, is poor form.</p>
-
-</div> <!-- objects.operands.casts -->
-
-</div> <!-- objects.operands -->
-
-<div id="objects.restrictions">
-<h1>Restrictions</h1>
-
-<div id="objects.restrictions.conversion">
-<h1>Conversion of retainable object pointers</h1>
-
-<p>In general, a program which attempts to implicitly or explicitly
-convert a value of retainable object pointer type to any
-non-retainable type, or vice-versa, is ill-formed. For example, an
-Objective-C object pointer shall not be converted to <tt>void*</tt>.
-As an exception, cast to <tt>intptr_t</tt> is allowed because such
-casts are not transferring ownership. The <a href="#objects.operands.casts">bridged
-casts</a> may be used to perform these conversions where
-necessary.</p>
-
-<div class="rationale"><p>Rationale: we cannot ensure the correct
-management of the lifetime of objects if they may be freely passed
-around as unmanaged types. The bridged casts are provided so that the
-programmer may explicitly describe whether the cast transfers control
-into or out of ARC.</p></div>
-
-<p>However, the following exceptions apply.</p>
-
-</div> <!-- objects.restrictions.conversion -->
-
-<div id="objects.restrictions.conversion-exception-known">
-<h1>Conversion to retainable object pointer type of
- expressions with known semantics</h1>
-
-<p><span class="revision"><span class="whenRevised">[beginning Apple
- 4.0, LLVM 3.1]</span> These exceptions have been greatly expanded;
- they previously applied only to a much-reduced subset which is
- difficult to categorize but which included null pointers, message
- sends (under the given rules), and the various global constants.</span></p>
-
-<p>An unbridged conversion to a retainable object pointer type from a
-type other than a retainable object pointer type is ill-formed, as
-discussed above, unless the operand of the cast has a syntactic form
-which is known retained, known unretained, or known
-retain-agnostic.</p>
-
-<p>An expression is <span class="term">known retain-agnostic</span> if
-it is:</p>
-<ul>
-<li>an Objective-C string literal,</li>
-<li>a load from a <tt>const</tt> system global variable of
-<a href="#misc.c-retainable">C retainable pointer type</a>, or</li>
-<li>a null pointer constant.</li>
-</ul>
-
-<p>An expression is <span class="term">known unretained</span> if it
-is an rvalue of <a href="#misc.c-retainable">C retainable
-pointer type</a> and it is:</p>
-<ul>
-<li>a direct call to a function, and either that function has the
- <tt>cf_returns_not_retained</tt> attribute or it is an
- <a href="#misc.c-retainable.audit">audited</a> function that does not
- have the <tt>cf_returns_retained</tt> attribute and does not follow
- the create/copy naming convention,</li>
-<li>a message send, and the declared method either has
- the <tt>cf_returns_not_retained</tt> attribute or it has neither
- the <tt>cf_returns_retained</tt> attribute nor a
- <a href="#family">selector family</a> that implies a retained
- result.</li>
-</ul>
-
-<p>An expression is <span class="term">known retained</span> if it is
-an rvalue of <a href="#misc.c-retainable">C retainable pointer type</a>
-and it is:</p>
-<ul>
-<li>a message send, and the declared method either has the
- <tt>cf_returns_retained</tt> attribute, or it does not have
- the <tt>cf_returns_not_retained</tt> attribute but it does have a
- <a href="#family">selector family</a> that implies a retained
- result.</li>
-</ul>
-
-<p>Furthermore:</p>
-<ul>
-<li>a comma expression is classified according to its right-hand side,</li>
-<li>a statement expression is classified according to its result
-expression, if it has one,</li>
-<li>an lvalue-to-rvalue conversion applied to an Objective-C property
-lvalue is classified according to the underlying message send, and</li>
-<li>a conditional operator is classified according to its second and
-third operands, if they agree in classification, or else the other
-if one is known retain-agnostic.</li>
-</ul>
-
-<p>If the cast operand is known retained, the conversion is treated as
-a <tt>__bridge_transfer</tt> cast. If the cast operand is known
-unretained or known retain-agnostic, the conversion is treated as
-a <tt>__bridge</tt> cast.</p>
-
-<div class="rationale"><p>Rationale: Bridging casts are annoying.
-Absent the ability to completely automate the management of CF
-objects, however, we are left with relatively poor attempts to reduce
-the need for a glut of explicit bridges. Hence these rules.</p>
-
-<p>We've so far consciously refrained from implicitly turning retained
-CF results from function calls into <tt>__bridge_transfer</tt> casts.
-The worry is that some code patterns &mdash; for example, creating a
-CF value, assigning it to an ObjC-typed local, and then
-calling <tt>CFRelease</tt> when done &mdash; are a bit too likely to
-be accidentally accepted, leading to mysterious behavior.</p></div>
-
-</div> <!-- objects.restrictions.conversion-exception-known -->
-
-<div id="objects.restrictions.conversion-exception-contextual">
-<h1>Conversion from retainable object pointer type in certain contexts</h1>
-
-<p><span class="revision"><span class="whenRevised">[beginning Apple
- 4.0, LLVM 3.1]</span></span></p>
-
-<p>If an expression of retainable object pointer type is explicitly
-cast to a <a href="#misc.c-retainable">C retainable pointer type</a>,
-the program is ill-formed as discussed above unless the result is
-immediately used:</p>
-
-<ul>
-<li>to initialize a parameter in an Objective-C message send where the
-parameter is not marked with the <tt>cf_consumed</tt> attribute, or</li>
-<li>to initialize a parameter in a direct call to
-an <a href="#misc.c-retainable.audit">audited</a> function where the
-parameter is not marked with the <tt>cf_consumed</tt> attribute.</li>
-</ul>
-
-<div class="rationale"><p>Rationale: Consumed parameters are left out
-because ARC would naturally balance them with a retain, which was
-judged too treacherous. This is in part because several of the most
-common consuming functions are in the <tt>Release</tt> family, and it
-would be quite unfortunate for explicit releases to be silently
-balanced out in this way.</p></div>
-
-</div> <!-- objects.restrictions.conversion-exception-contextual -->
-
-</div> <!-- objects.restrictions -->
-
-</div> <!-- objects -->
-
-<div id="ownership">
-<h1>Ownership qualification</h1>
-
-<p>This section describes the behavior of <em>objects</em> of
-retainable object pointer type; that is, locations in memory which
-store retainable object pointers.</p>
-
-<p>A type is a <span class="term">retainable object owner type</span>
-if it is a retainable object pointer type or an array type whose
-element type is a retainable object owner type.</p>
-
-<p>An <span class="term">ownership qualifier</span> is a type
-qualifier which applies only to retainable object owner types. An array type is
-ownership-qualified according to its element type, and adding an ownership
-qualifier to an array type so qualifies its element type.</p>
-
-<p>A program is ill-formed if it attempts to apply an ownership qualifier
-to a type which is already ownership-qualified, even if it is the same
-qualifier. There is a single exception to this rule: an ownership qualifier
-may be applied to a substituted template type parameter, which overrides the
-ownership qualifier provided by the template argument.</p>
-
-<p>Except as described under
-the <a href="#ownership.inference">inference rules</a>, a program is
-ill-formed if it attempts to form a pointer or reference type to a
-retainable object owner type which lacks an ownership qualifier.</p>
-
-<div class="rationale"><p>Rationale: these rules, together with the
-inference rules, ensure that all objects and lvalues of retainable
-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>
-
-<p>There are four ownership qualifiers:</p>
-
-<ul>
-<li><tt>__autoreleasing</tt></li>
-<li><tt>__strong</tt></li>
-<li><tt>__unsafe_unretained</tt></li>
-<li><tt>__weak</tt></li>
-</ul>
-
-<p>A type is <span class="term">nontrivially ownership-qualified</span>
-if it is qualified with <tt>__autoreleasing</tt>, <tt>__strong</tt>, or
-<tt>__weak</tt>.</p>
-
-<div id="ownership.spelling">
-<h1>Spelling</h1>
-
-<p>The names of the ownership qualifiers are reserved for the
-implementation. A program may not assume that they are or are not
-implemented with macros, or what those macros expand to.</p>
-
-<p>An ownership qualifier may be written anywhere that any other type
-qualifier may be written.</p>
-
-<p>If an ownership qualifier appears in
-the <i>declaration-specifiers</i>, the following rules apply:</p>
-
-<ul>
-<li>if the type specifier is a retainable object owner type, the
-qualifier applies to that type;</li>
-<li>if the outermost non-array part of the declarator is a pointer or
-block pointer, the qualifier applies to that type;</li>
-<li>otherwise the program is ill-formed.</li>
-</ul>
-
-<p>If an ownership qualifier appears on the declarator name, or on the
-declared object, it is applied to outermost pointer or block-pointer
-type.</p>
-
-<p>If an ownership qualifier appears anywhere else in a declarator, it
-applies to the type there.</p>
-
-<div id="ownership.spelling.property">
-<h1>Property declarations</h1>
-
-<p>A property of retainable object pointer type may have ownership.
-If the property's type is ownership-qualified, then the property has
-that ownership. If the property has one of the following