<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Matt Galloway]]></title>
  <link href="http://www.galloway.me.uk/atom.xml" rel="self"/>
  <link href="http://www.galloway.me.uk/"/>
  <updated>2015-01-05T21:18:22+00:00</updated>
  <id>http://www.galloway.me.uk/</id>
  <author>
    <name><![CDATA[Matt Galloway]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[iOS 7 by Tutorials]]></title>
    <link href="http://www.galloway.me.uk/2013/09/ios-7-by-tutorials/"/>
    <updated>2013-09-18T20:00:00+01:00</updated>
    <id>http://www.galloway.me.uk/2013/09/ios-7-by-tutorials</id>
    <content type="html"><![CDATA[<p>The RayWenderlich.com team has been hard at work after WWDC, once again, to bring this year&rsquo;s &ldquo;by tutorials&rdquo; book. This year it&rsquo;s, of course, <a href="http://www.raywenderlich.com/store/ios-7-by-tutorials?source=swipestack">iOS 7 by Tutorials</a>. And today I can announce that we have finally been able to release it now that Apple&rsquo;s iOS 7 NDA has been released!</p>

<p><a href="http://www.raywenderlich.com/store/ios-7-by-tutorials?source=swipestack"><img src="http://www.galloway.me.uk/images/ios_7_by_tutorials_large.jpg" alt="iOS 7 by Tutorials" /></a></p>

<!--more-->


<p>The book covers a ridiculous number of things. Here&rsquo;s the outline (with the chapters I wrote in bold):</p>

<ul>
<li>Designing for iOS 7</li>
<li>UIKit Dynamics</li>
<li>Custom View Controller Transitions</li>
<li>Text Kit</li>
<li>Transitioning to iOS 7</li>
<li>What’s New in Xcode 5</li>
<li><strong>What’s New in Objective-C and Foundation</strong></li>
<li>Unit Testing in Xcode 5</li>
<li>Beginning Source Control in Xcode 5</li>
<li>Beginning Continuous Integration in Xcode 5</li>
<li>Networking with NSURLSession</li>
<li>Multitasking</li>
<li>JavaScriptCore Framework</li>
<li>AirDrop</li>
<li>Peer-to-Peer Connectivity</li>
<li><strong>Inter-App Audio</strong></li>
<li><strong>What’s New in AVFoundation</strong></li>
<li><strong>What’s New in MapKit</strong></li>
<li>What’s New in Core Location</li>
<li>What’s New in PassKit</li>
<li>Bonus: Introduction to iAd</li>
</ul>


<p>Also, there is what we&rsquo;re calling an <a href="http://www.raywenderlich.com/49762/introducing-the-ios-7-feast">&ldquo;iOS 7 Feast&rdquo;</a>. This is a whole load of free stuff from site including tutorials, updated tutorials and even some stuff we&rsquo;re giving away!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Book review -- Learning iOS Design: A Hands-On Guide for Programmers and Designers]]></title>
    <link href="http://www.galloway.me.uk/2013/08/book-review-learning-ios-design-a-hands-on-guide-for-programmers-and-designers/"/>
    <updated>2013-08-10T13:28:00+01:00</updated>
    <id>http://www.galloway.me.uk/2013/08/book-review-learning-ios-design-a-hands-on-guide-for-programmers-and-designers</id>
    <content type="html"><![CDATA[<p>Design is something that most developers have to do these days. If you&rsquo;re an indie developer then you&rsquo;re likely going to need to do the full UX/UI dance yourself. Even if you&rsquo;re working for a company with a UX/UI team, then you will probably find yourself talking about UX/UI from time to time.</p>

<p>Understanding UX/UI is therefore extremely important.</p>

<p>I had the fortune to be able to review a great book about iOS design. It&rsquo;s called &ldquo;Learning iOS Design: A Hands-On Guide for Programmers and Designers&rdquo;.</p>

<p><a href="http://click.linksynergy.com/link?id=lSck1lD/dd8&offerid=163217.1926524&type=2&murl=http%3A%2F%2Fwww.informit.com%2Fstore%2Fproduct.aspx%3Fisbn%3D0321887492"><IMG border=0 src="http://www.informit.com/ShowCover.aspx?isbn=0321887492&type=d" /></a></p>

<!--more-->


<p>And here is my review:</p>

<blockquote><p>First off &ndash; this book is a truly great read.</p>

<p>Most iOS developers will at some point have to do their own design work. That is unless > you&rsquo;re extremely lucky and have a designer sitting next to you when you&rsquo;re working on your own projects. If you&rsquo;re like me, then UX and UI does not come naturally. This book fills in that gap nicely. It delves deep into the scary world of UX and UI and gives some really useful tips. I&rsquo;ve always done wireframes, but the tips in this book really helped understand what they&rsquo;re really for. Also I particularly enjoyed the discussion on typography and visual weight.</p>

<p>The third part of the book is all about finding a balance for your own apps. This was a great read to see why and when to use certain patterns. A lot of this content really made me think about my own designs. I shall certainly be flicking back through this in the future when I need inspiration or a reality check.</p>

<p>Overall, a great book. I recommend it for any iOS developer.</p></blockquote>

<p>I recommend this book to anyone who does any iOS design at all. It&rsquo;s a valuable resource!</p>

<p>You can buy the book directly from Pearson here:</p>

<ul>
<li><a href="http://click.linksynergy.com/link?id=lSck1lD/dd8&amp;offerid=163217.1926486&amp;type=2&amp;murl=http%3A%2F%2Fwww.informit.com%2Fstore%2Fproduct.aspx%3Fisbn%3D0133157504">eBook</a></li>
<li><a href="http://click.linksynergy.com/link?id=lSck1lD/dd8&amp;offerid=163217.1926524&amp;type=2&amp;murl=http%3A%2F%2Fwww.informit.com%2Fstore%2Fproduct.aspx%3Fisbn%3D0321887492">Paper</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A look inside blocks: Episode 3 (Block_copy)]]></title>
    <link href="http://www.galloway.me.uk/2013/05/a-look-inside-blocks-episode-3-block-copy/"/>
    <updated>2013-05-26T21:00:00+01:00</updated>
    <id>http://www.galloway.me.uk/2013/05/a-look-inside-blocks-episode-3-block-copy</id>
    <content type="html"><![CDATA[<p>This post has been a long time coming. It&rsquo;s been a draft for many months, but I&rsquo;ve been busy writing <a href="http://www.effectiveobjectivec.com/">my book</a> and didn&rsquo;t have time to finish it off. But now I&rsquo;ve finished it and here it is!</p>

<p>Following on from <a href="http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-1">episode 1</a> and <a href="http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-2">episode 2</a> of my look inside blocks, this post takes a deeper look at what happens when a block is copied. You&rsquo;ve likely heard the terminology that &ldquo;blocks start off on the stack&rdquo; and &ldquo;you must copy them if you want to save them for later use&rdquo;. But, why? And what actually happens during a copy? I&rsquo;ve long wondered exactly what the mechanism is for copying a block. For example, what happens to the values captured by the block? In this post I take a look.</p>

<!--more-->


<h2>What we know so far</h2>

<p>From episodes <a href="http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-1">1</a> and <a href="http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-2">2</a>, we found out that the memory layout for a block is like this:</p>

<p><img src="http://www.galloway.me.uk/media/images/2013-05-26-a-look-inside-blocks-episode-3-block-copy/block_layout.png" alt="Block layout diagram" /></p>

<p>In <a href="http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-2">episode 2</a> we found out that this struct is created on the stack when the block is initially referenced. Since it&rsquo;s on the stack, the memory can be reused after the enclosing scope of the block ends. So what happens then if you want to use that block later on? Well, you have to copy it. This is done with a call to <code>Block_copy()</code> or rather just send the Objective-C message <code>copy</code> to it, since a block poses as an Objective-C object. This just calls <code>Block_copy()</code>.</p>

<p>So what better than to take a look at what <code>Block_copy()</code> does.</p>

<h2>Block_copy()</h2>

<p>First of all, we need to look in <a href="http://opensource.apple.com/source/clang/clang-137/src/projects/compiler-rt/BlocksRuntime/Block.h"><code>Block.h</code></a>. Here there are the following definitions:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="cp">#define Block_copy(...) ((__typeof(__VA_ARGS__))_Block_copy((const void *)(__VA_ARGS__)))</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="o">*</span><span class="n">_Block_copy</span><span class="p">(</span><span class="k">const</span> <span class="kt">void</span> <span class="o">*</span><span class="n">arg</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>So <code>Block_copy()</code> is purely a <code>#define</code> that casts the argument passed in to a <code>const void *</code> and passes it to <code>_Block_copy()</code>. There is also the prototype for <code>_Block_copy()</code>. The implementation is in <a href="http://opensource.apple.com/source/clang/clang-137/src/projects/compiler-rt/BlocksRuntime/runtime.c"><code>runtime.c</code></a>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="kt">void</span> <span class="o">*</span><span class="nf">_Block_copy</span><span class="p">(</span><span class="k">const</span> <span class="kt">void</span> <span class="o">*</span><span class="n">arg</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">_Block_copy_internal</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">WANTS_ONE</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>So that just calls <code>_Block_copy_internal()</code> passing the block itself and <code>WANTS_ONE</code>. To see what this means, we need to look at the implementation. This is also in <a href="http://opensource.apple.com/source/clang/clang-137/src/projects/compiler-rt/BlocksRuntime/runtime.c"><code>runtime.c</code></a>. Here is the function, with the irrelevant stuff removed (mostly garbage collection stuff):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="k">static</span> <span class="kt">void</span> <span class="o">*</span><span class="nf">_Block_copy_internal</span><span class="p">(</span><span class="k">const</span> <span class="kt">void</span> <span class="o">*</span><span class="n">arg</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">flags</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">struct</span> <span class="n">Block_layout</span> <span class="o">*</span><span class="n">aBlock</span><span class="p">;</span>
</span><span class='line'>    <span class="k">const</span> <span class="n">bool</span> <span class="n">wantsOne</span> <span class="o">=</span> <span class="p">(</span><span class="n">WANTS_ONE</span> <span class="o">&amp;</span> <span class="n">flags</span><span class="p">)</span> <span class="o">==</span> <span class="n">WANTS_ONE</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// 1</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">arg</span><span class="p">)</span> <span class="k">return</span> <span class="nb">NULL</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// 2</span>
</span><span class='line'>    <span class="n">aBlock</span> <span class="o">=</span> <span class="p">(</span><span class="k">struct</span> <span class="n">Block_layout</span> <span class="o">*</span><span class="p">)</span><span class="n">arg</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// 3</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">aBlock</span><span class="o">-&gt;</span><span class="n">flags</span> <span class="o">&amp;</span> <span class="n">BLOCK_NEEDS_FREE</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// latches on high</span>
</span><span class='line'>        <span class="n">latching_incr_int</span><span class="p">(</span><span class="o">&amp;</span><span class="n">aBlock</span><span class="o">-&gt;</span><span class="n">flags</span><span class="p">);</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">aBlock</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// 4</span>
</span><span class='line'>    <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">aBlock</span><span class="o">-&gt;</span><span class="n">flags</span> <span class="o">&amp;</span> <span class="n">BLOCK_IS_GLOBAL</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">aBlock</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// 5</span>
</span><span class='line'>    <span class="k">struct</span> <span class="n">Block_layout</span> <span class="o">*</span><span class="n">result</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="n">aBlock</span><span class="o">-&gt;</span><span class="n">descriptor</span><span class="o">-&gt;</span><span class="n">size</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">result</span><span class="p">)</span> <span class="k">return</span> <span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="p">)</span><span class="mi">0</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// 6</span>
</span><span class='line'>    <span class="n">memmove</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">aBlock</span><span class="p">,</span> <span class="n">aBlock</span><span class="o">-&gt;</span><span class="n">descriptor</span><span class="o">-&gt;</span><span class="n">size</span><span class="p">);</span> <span class="c1">// bitcopy first</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// 7</span>
</span><span class='line'>    <span class="n">result</span><span class="o">-&gt;</span><span class="n">flags</span> <span class="o">&amp;=</span> <span class="o">~</span><span class="p">(</span><span class="n">BLOCK_REFCOUNT_MASK</span><span class="p">);</span>    <span class="c1">// XXX not needed</span>
</span><span class='line'>    <span class="n">result</span><span class="o">-&gt;</span><span class="n">flags</span> <span class="o">|=</span> <span class="n">BLOCK_NEEDS_FREE</span> <span class="o">|</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// 8</span>
</span><span class='line'>    <span class="n">result</span><span class="o">-&gt;</span><span class="n">isa</span> <span class="o">=</span> <span class="n">_NSConcreteMallocBlock</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// 9</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">result</span><span class="o">-&gt;</span><span class="n">flags</span> <span class="o">&amp;</span> <span class="n">BLOCK_HAS_COPY_DISPOSE</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="p">(</span><span class="o">*</span><span class="n">aBlock</span><span class="o">-&gt;</span><span class="n">descriptor</span><span class="o">-&gt;</span><span class="n">copy</span><span class="p">)(</span><span class="n">result</span><span class="p">,</span> <span class="n">aBlock</span><span class="p">);</span> <span class="c1">// do fixup</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And here is what that method does:</p>

<ol>
<li><p> If the passed argument is <code>NULL</code> then just return <code>NULL</code>. This makes the method safe to passing a <code>NULL</code> block.</p></li>
<li><p> Cast the argument to a pointer to a <code>struct Block_layout</code>. You may remember what one of these is from <a href="http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-1">episode 1</a>. It&rsquo;s the internal data structure that makes up a block including a pointer to the implementation function of the block and various bits of metadata.</p></li>
<li><p> If the block&rsquo;s flags includes <code>BLOCK_NEEDS_FREE</code> then the block is a heap block (you&rsquo;ll see why shortly). In this case, all that needs doing is the reference count needs incrementing and then the same block returned.</p></li>
<li><p> If the block is a global block (recall these from <a href="http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-1">episode 1</a>) then nothing needs doing and the same block is returned. This is because global blocks are effectively singletons.</p></li>
<li><p> If we&rsquo;ve gotten here, then the block must be a stack allocated block. In which case, the block needs to be copied to the heap. This is the fun part. In this first step, <code>malloc()</code> is used to create a portion of memory of the required size. If that fails, then <code>NULL</code> is returned, otherwise we carry on.</p></li>
<li><p> Here, <code>memmove()</code> is used to copy bit-for-bit then current, stack allocated block to the portion of memory we just allocated for the heap allocated block. This just makes sure that all the metadata is copied over such as the block descriptor.</p></li>
<li><p> Next, the flags of the block are updated. The first line ensures that the reference count is set to 0. The comment indicates that this is not needed &ndash; presumably because at this point the reference count should already be 0. I guess this line is left in just in case a bug ever exists where the reference count is not 0. The next line sets the <code>BLOCK_NEEDS_FREE</code> flag. This indicates that it&rsquo;s a heap block and the memory backing it will, once the reference count drops to zero, require <code>free</code>-ing. The <code>| 1</code> on this line sets the reference count of the block to 1.</p></li>
<li><p> Here the block&rsquo;s <code>isa</code> pointer is set to be <code>_NSConcreteMallocBlock</code>, which means it&rsquo;s a heap block.</p></li>
<li><p> Finally, if the block has a copy helper function then this is invoked. The compiler will generate the copy helper function if it&rsquo;s required. It&rsquo;s required for blocks that capture objects for example. In such cases, the copy helper function will retain the captured objects.</p></li>
</ol>


<p>That&rsquo;s pretty neat, eh! Now you know what happens when a block is copied! But that&rsquo;s only half of the picture, right? What about when one is released?</p>

<h2>Block_release()</h2>

<p>The other half of the <code>Block_copy()</code> picture is <code>Block_release()</code>. Once again, this is actually a macro that looks like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="cp">#define Block_release(...) _Block_release((const void *)(__VA_ARGS__))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Just like <code>Block_copy()</code>, <code>Block_release()</code> calls through to a function after casting the argument for us. This just helps out the developer, so that they don&rsquo;t have to cast themselves.</p>

<p>Let&rsquo;s take a look at <code>_Block_release()</code> (with slight rearrangement for clarity and garbage collection specific code removed):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="kt">void</span> <span class="nf">_Block_release</span><span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="n">arg</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// 1</span>
</span><span class='line'>    <span class="k">struct</span> <span class="n">Block_layout</span> <span class="o">*</span><span class="n">aBlock</span> <span class="o">=</span> <span class="p">(</span><span class="k">struct</span> <span class="n">Block_layout</span> <span class="o">*</span><span class="p">)</span><span class="n">arg</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">aBlock</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// 2</span>
</span><span class='line'>    <span class="kt">int32_t</span> <span class="n">newCount</span><span class="p">;</span>
</span><span class='line'>    <span class="n">newCount</span> <span class="o">=</span> <span class="n">latching_decr_int</span><span class="p">(</span><span class="o">&amp;</span><span class="n">aBlock</span><span class="o">-&gt;</span><span class="n">flags</span><span class="p">)</span> <span class="o">&amp;</span> <span class="n">BLOCK_REFCOUNT_MASK</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// 3</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">newCount</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// 4</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">aBlock</span><span class="o">-&gt;</span><span class="n">flags</span> <span class="o">&amp;</span> <span class="n">BLOCK_NEEDS_FREE</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">aBlock</span><span class="o">-&gt;</span><span class="n">flags</span> <span class="o">&amp;</span> <span class="n">BLOCK_HAS_COPY_DISPOSE</span><span class="p">)(</span><span class="o">*</span><span class="n">aBlock</span><span class="o">-&gt;</span><span class="n">descriptor</span><span class="o">-&gt;</span><span class="n">dispose</span><span class="p">)(</span><span class="n">aBlock</span><span class="p">);</span>
</span><span class='line'>        <span class="n">_Block_deallocator</span><span class="p">(</span><span class="n">aBlock</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// 5</span>
</span><span class='line'>    <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">aBlock</span><span class="o">-&gt;</span><span class="n">flags</span> <span class="o">&amp;</span> <span class="n">BLOCK_IS_GLOBAL</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// 6</span>
</span><span class='line'>    <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Block_release called upon a stack Block: %p, ignored</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="p">)</span><span class="n">aBlock</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And here&rsquo;s what each bit does:</p>

<ol>
<li><p> First the argument is cast to a pointer to a <code>struct Block_layout</code>, since that&rsquo;s what it is. And if <code>NULL</code> is passed in, then we return early to make the function safe against passing in <code>NULL</code>.</p></li>
<li><p> Here the portion of the block flags that signifies the reference count (recall from <code>Block_copy()</code> the part where the flags were set to indicate a reference count of 1) is decremented.</p></li>
<li><p> If the new count is greater than 0, then there&rsquo;s still things holding a reference to the block and so the block does not need to be freed yet.</p></li>
<li><p> Otherwise, if the flags include <code>BLOCK_NEEDS_FREE</code>, then this is a heap allocated block, and the reference count is 0, so the block should be freed. First of all though, the dispose helper function of the block is invoked. This is the antonym of the copy helper function. It performs the reverse, such as releasing any captured objects. Finally, the block is deallocated through use of <code>_Block_deallocator</code>. If you go hunting in <a href="http://opensource.apple.com/source/clang/clang-137/src/projects/compiler-rt/BlocksRuntime/runtime.c"><code>runtime.c</code></a> then you&rsquo;ll see that this ends up being a function pointer to <code>free</code>, which just frees memory allocated with <code>malloc</code>.</p></li>
<li><p> If we made it here and the block is global, then do nothing.</p></li>
<li><p> If we made it all the way to here, then something strange has happened because a stack block has attempted to be released, so a log line is printed to warn the developer. In reality, you should never see this being hit.</p></li>
</ol>


<p>And that is that! There&rsquo;s not really much more to it!</p>

<h2>What&rsquo;s next?</h2>

<p>That concludes my tour into blocks, for now. Some of this material is covered in <a href="http://www.effectiveobjectivec.com/">my book</a>. It&rsquo;s more about how to use blocks effectively, but there&rsquo;s still a good portion of deep-dive material that should be of interest if you enjoyed this.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Effective Objective-C 2.0]]></title>
    <link href="http://www.galloway.me.uk/2013/05/effective-objective-c-2-dot-0/"/>
    <updated>2013-05-26T11:28:00+01:00</updated>
    <id>http://www.galloway.me.uk/2013/05/effective-objective-c-2-dot-0</id>
    <content type="html"><![CDATA[<p>Well, I&rsquo;ve been extremely quiet on here recently! That&rsquo;s because I&rsquo;ve not only been hard at work over at <a href="http://www.raywenderlich.com/">RayWenderlich.com</a> where I am now an editor as well as a tutorial contributor, but I&rsquo;ve been finishing off my book, <a href="http://www.effectiveobjectivec.com">Effective Objective-C 2.0</a>! I can now reveal that it is finally in print and I even have the picture to prove it:</p>

<p><img src="https://fbcdn-sphotos-c-a.akamaihd.net/hphotos-ak-frc1/249071_10100544175679740_1398760173_n.jpg" alt="Effective Objective-C 2.0 unboxing" /></p>

<!--more-->


<p>So what is this book then? Well, it&rsquo;s part of the excellent <a href="http://click.linksynergy.com/fs-bin/click?id=lSck1lD/dd8&amp;subid=&amp;offerid=145238.1&amp;type=10&amp;tmpid=3559&amp;RD_PARM1=http%253A%252F%252Fwww.informit.com%252Fimprint%252Fseries_detail.aspx%253Fst%253D61267">Effective Software Dev Series</a>, for which Scott Meyers is the series editor. I am absolutely over-the-moon to be able to add to this series with my book. Thanks go out to Scott for letting me be a part of it.</p>

<p>All books in the <a href="http://click.linksynergy.com/fs-bin/click?id=lSck1lD/dd8&amp;subid=&amp;offerid=145238.1&amp;type=10&amp;tmpid=3559&amp;RD_PARM1=http%253A%252F%252Fwww.informit.com%252Fimprint%252Fseries_detail.aspx%253Fst%253D61267">Effective Software Dev Series</a> are based around a series of &ldquo;Items&rdquo;, each of which gives a small, succinct piece of information that you should understand and can learn from. The idea is that you can read each Item separately. They often cross-reference each other so if you find yourself wanting to find out more then you can follow the references.</p>

<p>I encourage all iOS and Mac developers who are post-beginner / intermediate to get their hands on a copy and start reading. You&rsquo;ll learn something for sure! Even if you&rsquo;re advanced you will get something out of the book because I go in-depth into a lot of core topics.</p>

<p>Here&rsquo;s some quick links if you&rsquo;re wanting to pick up a copy:</p>

<ul>
<li><a href="http://click.linksynergy.com/link?id=lSck1lD/dd8&amp;offerid=145238.1987402&amp;type=2&amp;murl=http://www.informit.com/store/product.aspx%3Fisbn%3D0321917014">Pearson &ndash; Hard copy &amp; eBook</a> &ndash; Use code PROGRAMMING35 for 35% off!</li>
<li><a href="http://www.amazon.com/gp/product/0321917014/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0321917014&amp;linkCode=as2&amp;tag=effecobjecc20-20">Amazon US &ndash; Hard copy</a></li>
<li><a href="http://www.amazon.com/gp/product/B00CUG5MZA/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B00CUG5MZA&amp;linkCode=as2&amp;tag=effecobjecc20-20">Amazon US &ndash; Kindle</a></li>
<li><a href="http://www.amazon.co.uk/gp/product/0321917014/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;camp=1634&amp;creative=6738&amp;creativeASIN=0321917014&amp;linkCode=as2&amp;tag=swistaltd-21">Amazon UK &ndash; Hard copy</a></li>
<li><a href="http://www.amazon.co.uk/gp/product/B00CUG5MZA/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;camp=1634&amp;creative=6738&amp;creativeASIN=B00CUG5MZA&amp;linkCode=as2&amp;tag=swistaltd-21">Amazon UK &ndash; Kindle</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Why I've been quiet recently]]></title>
    <link href="http://www.galloway.me.uk/2013/01/why-ive-been-quiet-recently/"/>
    <updated>2013-01-12T08:46:00+00:00</updated>
    <id>http://www.galloway.me.uk/2013/01/why-ive-been-quiet-recently</id>
    <content type="html"><![CDATA[<p>If you follow my blog then you&rsquo;ll notice that I&rsquo;ve been quiet over the past couple of months. Well, I have been quiet on here, but I have been writing. In fact, I&rsquo;ve been writing more than I ever have. That&rsquo;s because I&rsquo;m authoring a book! I have had the incredible fortune to be able to work with Pearson publishers to produce a book in the &ldquo;Effective&rdquo; series that was started with Scott Meyers&#8217; &ldquo;Effective C++&rdquo;. I am honoured to be able to write a book in this series.</p>

<p>The title of mine is going to be &ldquo;Effective Objective-C 2.0&rdquo;. It aims to be a book that teaches how to use Objective-C properly. It is split into over 50 short &ldquo;Items&rdquo; that each explain why you should write code in a certain way, or how to use a certain feature. It will help developers who have already read a beginner text and want to learn more.</p>

<p>The writing is going well and I am very close to finishing the first draft now. Then will come the editing phase, which is slightly daunting but I&rsquo;m very much looking forward to seeing it turn into a real book!</p>

<p>There&rsquo;s nothing I can show right now, but it will but on Safari &ldquo;Rough Cuts&rdquo; soon (I&rsquo;ll post a link when it is) so if you want to take a sneak peek you will be able to on there. For now, here are a few links to other books in the series that are also excellent:</p>

<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=matgalsiphapp-21&o=2&p=8&l=as1&asins=0321334876&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>




<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=matgalsiphapp-21&o=2&p=8&l=as1&asins=020163371X&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>




<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=matgalsiphapp-21&o=2&p=8&l=as1&asins=0201749629&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>




<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=matgalsiphapp-21&o=2&p=8&l=as1&asins=0321812182&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A look inside blocks: Episode 2]]></title>
    <link href="http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-2/"/>
    <updated>2012-10-12T09:00:00+01:00</updated>
    <id>http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-2</id>
    <content type="html"><![CDATA[<p>This is a follow on post to <a href="http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-1/">A look inside blocks: Episode 1</a> in which I looked into the innards of blocks and how the compiler sees them. In this article I take a look at blocks that are not constant and how they are formed on the stack.</p>

<!--more-->


<h2>Block types</h2>

<p>In the <a href="http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-1/">first article</a> we saw the block have a class of <code>_NSConcreteGlobalBlock</code>. The block structure and descriptor were both fully initialised at compile time since all variables were known. There are a few different types of block, each with their own associated class. However for simplicities sake, we just need to consider 3 of them:</p>

<ol>
<li><p> <code>_NSConcreteGlobalBlock</code> is a block defined globally where it is fully complete at compile time. These blocks are those that don&rsquo;t capture any scope such as an empty block.</p></li>
<li><p> <code>_NSConcreteStackBlock</code> is a block located on the stack. This is where all blocks start out before they are eventually copied onto the heap.</p></li>
<li><p> <code>_NSConcreteMallocBlock</code> is a block located on the heap. After copying a block, this is where they end up. Once here they are reference counted and freed when the reference count drops to zero.</p></li>
</ol>


<h2>A block that captures scope</h2>

<p>This time we&rsquo;re going to look at the following bit of code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="cp">#import &lt;dispatch/dispatch.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">typedef</span> <span class="kt">void</span><span class="p">(</span><span class="o">^</span><span class="n">BlockA</span><span class="p">)(</span><span class="kt">void</span><span class="p">);</span>
</span><span class='line'><span class="kt">void</span> <span class="n">foo</span><span class="p">(</span><span class="kt">int</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="n">__attribute__</span><span class="p">((</span><span class="n">noinline</span><span class="p">))</span>
</span><span class='line'><span class="kt">void</span> <span class="n">runBlockA</span><span class="p">(</span><span class="n">BlockA</span> <span class="n">block</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">block</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">doBlockA</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kt">int</span> <span class="n">a</span> <span class="o">=</span> <span class="mi">128</span><span class="p">;</span>
</span><span class='line'>    <span class="n">BlockA</span> <span class="n">block</span> <span class="o">=</span> <span class="o">^</span><span class="p">{</span>
</span><span class='line'>        <span class="n">foo</span><span class="p">(</span><span class="n">a</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="n">runBlockA</span><span class="p">(</span><span class="n">block</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The function called <code>foo</code> is just there so that the block captures something, by having a function to call with a captured variable. Once again, we look at the armv7 assembly produced, relevant bits only:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'>    <span class="p">.</span><span class="n">globl</span>  <span class="n">_runBlockA</span>
</span><span class='line'>    <span class="p">.</span><span class="n">align</span>  <span class="mi">2</span>
</span><span class='line'>    <span class="p">.</span><span class="n">code</span>   <span class="mi">16</span>                      <span class="err">@</span> <span class="err">@</span><span class="n">runBlockA</span>
</span><span class='line'>    <span class="p">.</span><span class="n">thumb_func</span>     <span class="n">_runBlockA</span>
</span><span class='line'><span class="nl">_runBlockA:</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">r0</span><span class="p">,</span> <span class="err">#</span><span class="mi">12</span><span class="p">]</span>
</span><span class='line'>    <span class="n">bx</span>      <span class="n">r1</span>
</span></code></pre></td></tr></table></div></figure>


<p>First of all the <code>runBlockA</code> function is the same as before. It&rsquo;s calling the <code>invoke</code> function of the block. Then onto <code>doBlockA</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'>    <span class="p">.</span><span class="n">globl</span>  <span class="n">_doBlockA</span>
</span><span class='line'>    <span class="p">.</span><span class="n">align</span>  <span class="mi">2</span>
</span><span class='line'>    <span class="p">.</span><span class="n">code</span>   <span class="mi">16</span>                      <span class="err">@</span> <span class="err">@</span><span class="n">doBlockA</span>
</span><span class='line'>    <span class="p">.</span><span class="n">thumb_func</span>     <span class="n">_doBlockA</span>
</span><span class='line'><span class="nl">_doBlockA:</span>
</span><span class='line'>    <span class="n">push</span>    <span class="p">{</span><span class="n">r7</span><span class="p">,</span> <span class="n">lr</span><span class="p">}</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r7</span><span class="p">,</span> <span class="n">sp</span>
</span><span class='line'>    <span class="n">sub</span>     <span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">24</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r2</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L__NSConcreteStackBlock</span><span class="err">$</span><span class="n">non_lazy_ptr</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_0</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r2</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L__NSConcreteStackBlock</span><span class="err">$</span><span class="n">non_lazy_ptr</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_0</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">___doBlockA_block_invoke_0</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_1</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC1_0:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r2</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">___doBlockA_block_invoke_0</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_1</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">___block_descriptor_tmp</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_2</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC1_1:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r1</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r2</span><span class="p">,</span> <span class="p">[</span><span class="n">r2</span><span class="p">]</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">___block_descriptor_tmp</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_2</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">str</span>     <span class="n">r2</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">]</span>
</span><span class='line'>    <span class="n">mov</span><span class="p">.</span><span class="n">w</span>   <span class="n">r2</span><span class="p">,</span> <span class="err">#</span><span class="mi">1073741824</span>
</span><span class='line'>    <span class="n">str</span>     <span class="n">r2</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">4</span><span class="p">]</span>
</span><span class='line'>    <span class="n">movs</span>    <span class="n">r2</span><span class="p">,</span> <span class="err">#</span><span class="mi">0</span>
</span><span class='line'><span class="nl">LPC1_2:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">str</span>     <span class="n">r2</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">8</span><span class="p">]</span>
</span><span class='line'>    <span class="n">str</span>     <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">12</span><span class="p">]</span>
</span><span class='line'>    <span class="n">str</span>     <span class="n">r0</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">16</span><span class="p">]</span>
</span><span class='line'>    <span class="n">movs</span>    <span class="n">r0</span><span class="p">,</span> <span class="err">#</span><span class="mi">128</span>
</span><span class='line'>    <span class="n">str</span>     <span class="n">r0</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">20</span><span class="p">]</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">sp</span>
</span><span class='line'>    <span class="n">bl</span>      <span class="n">_runBlockA</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">24</span>
</span><span class='line'>    <span class="n">pop</span>     <span class="p">{</span><span class="n">r7</span><span class="p">,</span> <span class="n">pc</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Well this is very different to before. Instead of seeing a block get loaded from a global symbol, it looks like a lot more work is being done. It might look daunting, but it&rsquo;s pretty easy to see what&rsquo;s going on. It&rsquo;s probably best to consider the function rearranged, but believe me that this doesn&rsquo;t alter anything functionally. The reason the compiler has emitted the instructions in the order it has is for optimisation to reduce pipeline bubbles, etc. So, rearranged the function looks like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="nl">_doBlockA:</span>
</span><span class='line'>        <span class="c1">// 1</span>
</span><span class='line'>        <span class="n">push</span>    <span class="p">{</span><span class="n">r7</span><span class="p">,</span> <span class="n">lr</span><span class="p">}</span>
</span><span class='line'>        <span class="n">mov</span>     <span class="n">r7</span><span class="p">,</span> <span class="n">sp</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// 2</span>
</span><span class='line'>        <span class="n">sub</span>     <span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">24</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// 3</span>
</span><span class='line'>        <span class="n">movw</span>    <span class="n">r2</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L__NSConcreteStackBlock</span><span class="err">$</span><span class="n">non_lazy_ptr</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_0</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>        <span class="n">movt</span>    <span class="n">r2</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L__NSConcreteStackBlock</span><span class="err">$</span><span class="n">non_lazy_ptr</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_0</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC1_0:</span>
</span><span class='line'>        <span class="n">add</span>     <span class="n">r2</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>        <span class="n">ldr</span>     <span class="n">r2</span><span class="p">,</span> <span class="p">[</span><span class="n">r2</span><span class="p">]</span>
</span><span class='line'>        <span class="n">str</span>     <span class="n">r2</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// 4</span>
</span><span class='line'>        <span class="n">mov</span><span class="p">.</span><span class="n">w</span>   <span class="n">r2</span><span class="p">,</span> <span class="err">#</span><span class="mi">1073741824</span>
</span><span class='line'>        <span class="n">str</span>     <span class="n">r2</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">4</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// 5</span>
</span><span class='line'>        <span class="n">movs</span>    <span class="n">r2</span><span class="p">,</span> <span class="err">#</span><span class="mi">0</span>
</span><span class='line'>        <span class="n">str</span>     <span class="n">r2</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">8</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// 6</span>
</span><span class='line'>        <span class="n">movw</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">___doBlockA_block_invoke_0</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_1</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>        <span class="n">movt</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">___doBlockA_block_invoke_0</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_1</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC1_1:</span>
</span><span class='line'>        <span class="n">add</span>     <span class="n">r1</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>        <span class="n">str</span>     <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">12</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// 7</span>
</span><span class='line'>        <span class="n">movw</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">___block_descriptor_tmp</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_2</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>        <span class="n">movt</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">___block_descriptor_tmp</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_2</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC1_2:</span>
</span><span class='line'>        <span class="n">add</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>        <span class="n">str</span>     <span class="n">r0</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">16</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// 8</span>
</span><span class='line'>        <span class="n">movs</span>    <span class="n">r0</span><span class="p">,</span> <span class="err">#</span><span class="mi">128</span>
</span><span class='line'>        <span class="n">str</span>     <span class="n">r0</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">20</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// 9</span>
</span><span class='line'>        <span class="n">mov</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">sp</span>
</span><span class='line'>        <span class="n">bl</span>      <span class="n">_runBlockA</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// 10</span>
</span><span class='line'>        <span class="n">add</span>     <span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">24</span>
</span><span class='line'>        <span class="n">pop</span>     <span class="p">{</span><span class="n">r7</span><span class="p">,</span> <span class="n">pc</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is what that is doing:</p>

<ol>
<li><p> Function prologue. <code>r7</code> is pushed onto the stack because it&rsquo;s going to get overwritten and is a register which must be preserved across function calls. <code>lr</code> is the link register and contains the address of the next instruction to execute when this function returns. See the function epilogue for more on that. Also, the stack pointer is saved into <code>r7</code>.</p></li>
<li><p> Subtract 24 from the stack pointer. This makes room for 24 bytes of data to be stored in stack space.</p></li>
<li><p> This little block of code is doing a lookup of the <code>L__NSConcreteStackBlock$non_lazy_ptr</code> symbol, relative to the program counter such that it works wherever the code may end up in the binary when finally linked. The value is then stored to the address of the stack pointer.</p></li>
<li><p> The value <code>1073741824</code> is stored to the stack pointer + 4.</p></li>
<li><p> The value <code>0</code> is stored to the stack pointer + 8. By now it may be becoming clear what&rsquo;s going on. A <code>Block_layout</code> structure is being created on the stack! Up until now there&rsquo;s the <code>isa</code> pointer, the <code>flags</code> and the <code>reserved</code> values being set.</p></li>
<li><p> The address of <code>___doBlockA_block_invoke_0</code> is stored at the stack pointer + 12. This is the <code>invoke</code> parameter of the block structure.</p></li>
<li><p> The address of <code>___block_descriptor_tmp</code> is stored at the stack pointer + 16. This is the <code>descriptor</code> parameter of the block structure.</p></li>
<li><p> The value <code>128</code> is stored at the stack pointer + 20. Ah. If you look back at the <code>Block_layout</code> struct you&rsquo;ll see that there&rsquo;s only 5 values in it. So what is this being stored after the end of the struct then? Well, you&rsquo;ll notice that the value is <code>128</code> which is the value of the variable captured in the block. So this must be where blocks store values that they use &ndash; after the end of the <code>Block_layout</code> struct.</p></li>
<li><p> The stack pointer, which now points to a fully initialised block structure is put into <code>r0</code> and <code>runBlockA</code> is called. (Remember that <code>r0</code> contains the first argument to a function in the ARM EABI).</p></li>
<li><p> Finally the stack pointer has 24 added back to it to balance out the subtraction at the start of the function. Then 2 values are popped off the stack into <code>r7</code> and <code>pc</code> respectively. The <code>r7</code> balances the push from the prologue and the <code>pc</code> will now get the value that was in <code>lr</code> when the function began. This effectively performs the return of the function as it sets the CPU to continue executing (the <code>pc</code>, program counter) from where the function was told to return to, <code>lr</code> the link register.</p></li>
</ol>


<p>Wow! You still with me? Brilliant!</p>

<p>The final bit of this little section is to check what the invoke function and the descriptor look like. We would expect them to be not much different to the global block from episode 1. Here they are:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'>    <span class="p">.</span><span class="n">align</span>  <span class="mi">2</span>
</span><span class='line'>    <span class="p">.</span><span class="n">code</span>   <span class="mi">16</span>                      <span class="err">@</span> <span class="err">@</span><span class="n">__doBlockA_block_invoke_0</span>
</span><span class='line'>    <span class="p">.</span><span class="n">thumb_func</span>     <span class="n">___doBlockA_block_invoke_0</span>
</span><span class='line'><span class="nl">___doBlockA_block_invoke_0:</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r0</span><span class="p">,</span> <span class="p">[</span><span class="n">r0</span><span class="p">,</span> <span class="err">#</span><span class="mi">20</span><span class="p">]</span>
</span><span class='line'>    <span class="n">b</span><span class="p">.</span><span class="n">w</span>     <span class="n">_foo</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">.</span><span class="n">section</span>        <span class="n">__TEXT</span><span class="p">,</span><span class="n">__cstring</span><span class="p">,</span><span class="n">cstring_literals</span>
</span><span class='line'><span class="n">L_</span><span class="p">.</span><span class="n">str</span><span class="o">:</span>                                 <span class="err">@</span> <span class="err">@</span><span class="p">.</span><span class="n">str</span>
</span><span class='line'>    <span class="p">.</span><span class="n">asciz</span>   <span class="s">&quot;v4@?0&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">.</span><span class="n">section</span>        <span class="n">__TEXT</span><span class="p">,</span><span class="n">__objc_classname</span><span class="p">,</span><span class="n">cstring_literals</span>
</span><span class='line'><span class="nl">L_OBJC_CLASS_NAME_:</span>                     <span class="err">@</span> <span class="err">@</span><span class="s">&quot;</span><span class="se">\01</span><span class="s">L_OBJC_CLASS_NAME_&quot;</span>
</span><span class='line'>    <span class="p">.</span><span class="n">asciz</span>   <span class="s">&quot;</span><span class="se">\001</span><span class="s">P&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">.</span><span class="n">section</span>        <span class="n">__DATA</span><span class="p">,</span><span class="n">__const</span>
</span><span class='line'>    <span class="p">.</span><span class="n">align</span>  <span class="mi">2</span>                       <span class="err">@</span> <span class="err">@</span><span class="n">__block_descriptor_tmp</span>
</span><span class='line'><span class="nl">___block_descriptor_tmp:</span>
</span><span class='line'>    <span class="p">.</span><span class="kt">long</span>   <span class="mi">0</span>                       <span class="err">@</span> <span class="mh">0x0</span>
</span><span class='line'>    <span class="p">.</span><span class="kt">long</span>   <span class="mi">24</span>                      <span class="err">@</span> <span class="mh">0x18</span>
</span><span class='line'>    <span class="p">.</span><span class="kt">long</span>   <span class="n">L_</span><span class="p">.</span><span class="n">str</span>
</span><span class='line'>    <span class="p">.</span><span class="kt">long</span>   <span class="n">L_OBJC_CLASS_NAME_</span>
</span></code></pre></td></tr></table></div></figure>


<p>And yep, there&rsquo;s not much difference really. The only difference is the <code>size</code> parameter of the block descriptor. It&rsquo;s now <code>24</code> rather than <code>20</code>. This is because there&rsquo;s an integer value captured by the block and so the block structure is 24 bytes rather than the standard 20. We saw the extra bytes being added to the end of the structure when it was created.</p>

<p>Also in the actual block function, i.e. <code>__doBlockA_block_invoke_0</code>, you can see the value being read out of the end of the block structure, i.e. <code>r0 + 20</code>. This is the variable captured in the block.</p>

<h2>What about capturing object types?</h2>

<p>The next thing to consider is what if instead of capturing an integer, it was an object type such as an <code>NSString</code>. To see what happens there, consider the following code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="cp">#import &lt;dispatch/dispatch.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">typedef</span> <span class="kt">void</span><span class="p">(</span><span class="o">^</span><span class="n">BlockA</span><span class="p">)(</span><span class="kt">void</span><span class="p">);</span>
</span><span class='line'><span class="kt">void</span> <span class="n">foo</span><span class="p">(</span><span class="n">NSString</span><span class="o">*</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="n">__attribute__</span><span class="p">((</span><span class="n">noinline</span><span class="p">))</span>
</span><span class='line'><span class="kt">void</span> <span class="n">runBlockA</span><span class="p">(</span><span class="n">BlockA</span> <span class="n">block</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">block</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">doBlockA</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">NSString</span> <span class="o">*</span><span class="n">a</span> <span class="o">=</span> <span class="s">@&quot;A&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="n">BlockA</span> <span class="n">block</span> <span class="o">=</span> <span class="o">^</span><span class="p">{</span>
</span><span class='line'>        <span class="n">foo</span><span class="p">(</span><span class="n">a</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="n">runBlockA</span><span class="p">(</span><span class="n">block</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>I won&rsquo;t go into the details of <code>doBlockA</code> because that doesn&rsquo;t change much. What is interesting is the block descriptor structure that&rsquo;s created:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'>    <span class="p">.</span><span class="n">section</span>        <span class="n">__DATA</span><span class="p">,</span><span class="n">__const</span>
</span><span class='line'>    <span class="p">.</span><span class="n">align</span>  <span class="mi">4</span>                       <span class="err">@</span> <span class="err">@</span><span class="n">__block_descriptor_tmp</span>
</span><span class='line'><span class="nl">___block_descriptor_tmp:</span>
</span><span class='line'>    <span class="p">.</span><span class="kt">long</span>   <span class="mi">0</span>                       <span class="err">@</span> <span class="mh">0x0</span>
</span><span class='line'>    <span class="p">.</span><span class="kt">long</span>   <span class="mi">24</span>                      <span class="err">@</span> <span class="mh">0x18</span>
</span><span class='line'>    <span class="p">.</span><span class="kt">long</span>   <span class="n">___copy_helper_block_</span>
</span><span class='line'>    <span class="p">.</span><span class="kt">long</span>   <span class="n">___destroy_helper_block_</span>
</span><span class='line'>    <span class="p">.</span><span class="kt">long</span>   <span class="n">L_</span><span class="p">.</span><span class="n">str1</span>
</span><span class='line'>    <span class="p">.</span><span class="kt">long</span>   <span class="n">L_OBJC_CLASS_NAME_</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice there are pointers to functions called <code>___copy_helper_block_</code> and <code>___destroy_helper_block_</code>. Here are the definitions of those functions:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'>    <span class="p">.</span><span class="n">align</span>  <span class="mi">2</span>
</span><span class='line'>    <span class="p">.</span><span class="n">code</span>   <span class="mi">16</span>                      <span class="err">@</span> <span class="err">@</span><span class="n">__copy_helper_block_</span>
</span><span class='line'>    <span class="p">.</span><span class="n">thumb_func</span>     <span class="n">___copy_helper_block_</span>
</span><span class='line'><span class="nl">___copy_helper_block_:</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">r1</span><span class="p">,</span> <span class="err">#</span><span class="mi">20</span><span class="p">]</span>
</span><span class='line'>    <span class="n">adds</span>    <span class="n">r0</span><span class="p">,</span> <span class="err">#</span><span class="mi">20</span>
</span><span class='line'>    <span class="n">movs</span>    <span class="n">r2</span><span class="p">,</span> <span class="err">#</span><span class="mi">3</span>
</span><span class='line'>    <span class="n">b</span><span class="p">.</span><span class="n">w</span>     <span class="n">__Block_object_assign</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">.</span><span class="n">align</span>  <span class="mi">2</span>
</span><span class='line'>    <span class="p">.</span><span class="n">code</span>   <span class="mi">16</span>                      <span class="err">@</span> <span class="err">@</span><span class="n">__destroy_helper_block_</span>
</span><span class='line'>    <span class="p">.</span><span class="n">thumb_func</span>     <span class="n">___destroy_helper_block_</span>
</span><span class='line'><span class="nl">___destroy_helper_block_:</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r0</span><span class="p">,</span> <span class="p">[</span><span class="n">r0</span><span class="p">,</span> <span class="err">#</span><span class="mi">20</span><span class="p">]</span>
</span><span class='line'>    <span class="n">movs</span>    <span class="n">r1</span><span class="p">,</span> <span class="err">#</span><span class="mi">3</span>
</span><span class='line'>    <span class="n">b</span><span class="p">.</span><span class="n">w</span>     <span class="n">__Block_object_dispose</span>
</span></code></pre></td></tr></table></div></figure>


<p>I assume these functions are what gets run when blocks are copied and destroyed. They must be retaining and releasing the object that was captured by the block. It looks like the copy function takes 2 parameters as both <code>r0</code> and <code>r1</code> are addressed as if they contain valid data. The destroy function looks like it just takes 1. All of the hard work looks like it&rsquo;s done by <code>_Block_object_assign</code> and <code>_Block_object_dispose</code>. The code for that is within the block runtime code, part of the <code>compiler-rt</code> project within LLVM.</p>

<p>If you want to go away and have a read of the code for the blocks runtime then take a look at the source which can be downloaded from <a href="http://compiler-rt.llvm.org">http://compiler-rt.llvm.org</a>. In particular, <code>runtime.c</code> is the file to look at.</p>

<h2>What next?</h2>

<p>In the next episode I shall take a look into the blocks runtime by investigating the code for <code>Block_copy</code> and see just how that does its business. This will give an insight into the copy and destroy helper functions we&rsquo;ve just seen get created for blocks that capture objects.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A look inside blocks: Episode 1]]></title>
    <link href="http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-1/"/>
    <updated>2012-10-11T16:56:00+01:00</updated>
    <id>http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-1</id>
    <content type="html"><![CDATA[<p>Today I have been taking a look at the internals of how blocks work from a compiler perspective. By blocks, I mean the closure that Apple added to the C language and is now well and truly established as part of the language from a clang/LLVM perspective. I had been wondering just what a &ldquo;block&rdquo; was and how it magically seems to appear as an Objective-C object (you can <code>copy</code>, <code>retain</code>, <code>release</code> them for instance). This blog post delves into blocks a little.</p>

<!--more-->


<h2>The basics</h2>

<p>This is a block:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='obj-c'><span class='line'><span class="kt">void</span><span class="p">(</span><span class="o">^</span><span class="n">block</span><span class="p">)(</span><span class="kt">void</span><span class="p">)</span> <span class="o">=</span> <span class="o">^</span><span class="p">{</span>
</span><span class='line'>    <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;I&#39;m a block!&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>This creates a variable called <code>block</code> which has a simple block assigned to it. That&rsquo;s easy. Done right? No. I wanted to understand what exactly the compiler does with that bit of code.</p>

<p>Further more, you can pass variables to block:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='obj-c'><span class='line'><span class="kt">void</span><span class="p">(</span><span class="o">^</span><span class="n">block</span><span class="p">)(</span><span class="kt">int</span> <span class="n">a</span><span class="p">)</span> <span class="o">=</span> <span class="o">^</span><span class="p">{</span>
</span><span class='line'>    <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;I&#39;m a block! a = %i&quot;</span><span class="p">,</span> <span class="n">a</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Or even return values from them:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='obj-c'><span class='line'><span class="kt">int</span><span class="p">(</span><span class="o">^</span><span class="n">block</span><span class="p">)(</span><span class="kt">void</span><span class="p">)</span> <span class="o">=</span> <span class="o">^</span><span class="p">{</span>
</span><span class='line'>    <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;I&#39;m a block!&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>And being a closure, they wrap up the context they are in:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='obj-c'><span class='line'><span class="kt">int</span> <span class="n">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'><span class="kt">void</span><span class="p">(</span><span class="o">^</span><span class="n">block</span><span class="p">)(</span><span class="kt">void</span><span class="p">)</span> <span class="o">=</span> <span class="o">^</span><span class="p">{</span>
</span><span class='line'>    <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;I&#39;m a block! a = %i&quot;</span><span class="p">,</span> <span class="n">a</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>So just how does the compiler sort all of these bits out then? <em>That</em> is what I was interested in.</p>

<h2>Diving into a simple example</h2>

<p>My first idea was to look at how the compiler compiles a very simple block. Consider the following code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='obj-c'><span class='line'><span class="cp">#import &lt;dispatch/dispatch.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">typedef</span> <span class="kt">void</span><span class="p">(</span><span class="o">^</span><span class="n">BlockA</span><span class="p">)(</span><span class="kt">void</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="n">__attribute__</span><span class="p">((</span><span class="n">noinline</span><span class="p">))</span>
</span><span class='line'><span class="kt">void</span> <span class="n">runBlockA</span><span class="p">(</span><span class="n">BlockA</span> <span class="n">block</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">block</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">doBlockA</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">BlockA</span> <span class="n">block</span> <span class="o">=</span> <span class="o">^</span><span class="p">{</span>
</span><span class='line'>        <span class="c1">// Empty block</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="n">runBlockA</span><span class="p">(</span><span class="n">block</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The reason for the two functions is that I wanted to see both how a block is &ldquo;called&rdquo; and how a block is set up. If both of these were in one function then the optimiser might be too clever and we wouldn&rsquo;t see anything interesting. I had to make the <code>runBlockA</code> function <code>noinline</code> so that the optimiser didn&rsquo;t just inline that function in <code>doBlockA</code> reducing it to the same problem.</p>

<p>The relevant bits of that code compiles down to this (armv7, <code>O3</code>):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'>    <span class="p">.</span><span class="n">globl</span>  <span class="n">_runBlockA</span>
</span><span class='line'>    <span class="p">.</span><span class="n">align</span>  <span class="mi">2</span>
</span><span class='line'>    <span class="p">.</span><span class="n">code</span>   <span class="mi">16</span>                      <span class="err">@</span> <span class="err">@</span><span class="n">runBlockA</span>
</span><span class='line'>    <span class="p">.</span><span class="n">thumb_func</span>     <span class="n">_runBlockA</span>
</span><span class='line'><span class="nl">_runBlockA:</span>
</span><span class='line'><span class="err">@</span> <span class="n">BB</span><span class="err">#</span><span class="mi">0</span><span class="o">:</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">r0</span><span class="p">,</span> <span class="err">#</span><span class="mi">12</span><span class="p">]</span>
</span><span class='line'>    <span class="n">bx</span>      <span class="n">r1</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is the <code>runBlockA</code> function. So, that&rsquo;s fairly simple then. Taking a look back up to the source for this, the function is just calling the block. <code>r0</code> (register 0) is set to the first argument of the function in the ARM EABI. The first instruction therefore means that <code>r1</code> is loaded from the value held in the adress stored in <code>r0 + 12</code>. Think of this as a dereference of a pointer, reading 12 bytes into it. Then we branch to that address. Notice that <code>r1</code> is used, which means that <code>r0</code> is still the block itself. So it&rsquo;s likely that the function this is calling takes the block as its first parameter.</p>

<p>From this I can ascertain that the block is likely some sort of structure where the function the block should execute is stored 12 bytes into said structure. And when a block is passed around, a pointer to one of these structures is passed.</p>

<p>Now onto the <code>doBlockA</code> method:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'>    <span class="p">.</span><span class="n">globl</span>  <span class="n">_doBlockA</span>
</span><span class='line'>    <span class="p">.</span><span class="n">align</span>  <span class="mi">2</span>
</span><span class='line'>    <span class="p">.</span><span class="n">code</span>   <span class="mi">16</span>                      <span class="err">@</span> <span class="err">@</span><span class="n">doBlockA</span>
</span><span class='line'>    <span class="p">.</span><span class="n">thumb_func</span>     <span class="n">_doBlockA</span>
</span><span class='line'><span class="nl">_doBlockA:</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">___block_literal_global</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_0</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">___block_literal_global</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_0</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC1_0:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">b</span><span class="p">.</span><span class="n">w</span>     <span class="n">_runBlockA</span>
</span></code></pre></td></tr></table></div></figure>


<p>Well, that&rsquo;s pretty simple also. This is a program counter relative load. You can just think of this as loading the address of the variable called <code>___block_literal_global</code> into <code>r0</code>. Then the <code>runBlockA</code> function is called. So given we know that the block object is being passed to <code>runBlockA</code>, this <code>___block_literal_global</code> must be that block object.</p>

<p>Now we&rsquo;re getting somewhere! But what exactly <em>is</em> <code>___block_literal_global</code>? Well, looking through the assembly we find this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'>    <span class="p">.</span><span class="n">align</span>  <span class="mi">2</span>                       <span class="err">@</span> <span class="err">@</span><span class="n">__block_literal_global</span>
</span><span class='line'><span class="nl">___block_literal_global:</span>
</span><span class='line'>    <span class="p">.</span><span class="kt">long</span>   <span class="n">__NSConcreteGlobalBlock</span>
</span><span class='line'>    <span class="p">.</span><span class="kt">long</span>   <span class="mi">1342177280</span>              <span class="err">@</span> <span class="mh">0x50000000</span>
</span><span class='line'>    <span class="p">.</span><span class="kt">long</span>   <span class="mi">0</span>                       <span class="err">@</span> <span class="mh">0x0</span>
</span><span class='line'>    <span class="p">.</span><span class="kt">long</span>   <span class="n">___doBlockA_block_invoke_0</span>
</span><span class='line'>    <span class="p">.</span><span class="kt">long</span>   <span class="n">___block_descriptor_tmp</span>
</span></code></pre></td></tr></table></div></figure>


<p>Ah ha! That looks very much like a struct to me. There&rsquo;s 5 values in the struct, each of which are 4-bytes (long). This must be the block object that <code>runBlockA</code> was acting upon. And look, 12 bytes into the struct is what looks suspiciously like a function pointer as it&rsquo;s called <code>___doBlockA_block_invoke_0</code>. Remember that was what the <code>runBlockA</code> function was jumping to.</p>

<p>But what is <code>__NSConcreteGlobalBlock</code>? Well, we&rsquo;ll come back to that. It&rsquo;s <code>___doBlockA_block_invoke_0</code> and <code>___block_descriptor_tmp</code> that are of interest since these also appear in the assembly:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'>    <span class="p">.</span><span class="n">align</span>  <span class="mi">2</span>
</span><span class='line'>    <span class="p">.</span><span class="n">code</span>   <span class="mi">16</span>                      <span class="err">@</span> <span class="err">@</span><span class="n">__doBlockA_block_invoke_0</span>
</span><span class='line'>    <span class="p">.</span><span class="n">thumb_func</span>     <span class="n">___doBlockA_block_invoke_0</span>
</span><span class='line'><span class="nl">___doBlockA_block_invoke_0:</span>
</span><span class='line'>    <span class="n">bx</span>      <span class="n">lr</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">.</span><span class="n">section</span>        <span class="n">__DATA</span><span class="p">,</span><span class="n">__const</span>
</span><span class='line'>    <span class="p">.</span><span class="n">align</span>  <span class="mi">2</span>                       <span class="err">@</span> <span class="err">@</span><span class="n">__block_descriptor_tmp</span>
</span><span class='line'><span class="nl">___block_descriptor_tmp:</span>
</span><span class='line'>    <span class="p">.</span><span class="kt">long</span>   <span class="mi">0</span>                       <span class="err">@</span> <span class="mh">0x0</span>
</span><span class='line'>    <span class="p">.</span><span class="kt">long</span>   <span class="mi">20</span>                      <span class="err">@</span> <span class="mh">0x14</span>
</span><span class='line'>    <span class="p">.</span><span class="kt">long</span>   <span class="n">L_</span><span class="p">.</span><span class="n">str</span>
</span><span class='line'>    <span class="p">.</span><span class="kt">long</span>   <span class="n">L_OBJC_CLASS_NAME_</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">.</span><span class="n">section</span>        <span class="n">__TEXT</span><span class="p">,</span><span class="n">__cstring</span><span class="p">,</span><span class="n">cstring_literals</span>
</span><span class='line'><span class="n">L_</span><span class="p">.</span><span class="n">str</span><span class="o">:</span>                                 <span class="err">@</span> <span class="err">@</span><span class="p">.</span><span class="n">str</span>
</span><span class='line'>    <span class="p">.</span><span class="n">asciz</span>   <span class="s">&quot;v4@?0&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">.</span><span class="n">section</span>        <span class="n">__TEXT</span><span class="p">,</span><span class="n">__objc_classname</span><span class="p">,</span><span class="n">cstring_literals</span>
</span><span class='line'><span class="nl">L_OBJC_CLASS_NAME_:</span>                     <span class="err">@</span> <span class="err">@</span><span class="s">&quot;</span><span class="se">\01</span><span class="s">L_OBJC_CLASS_NAME_&quot;</span>
</span><span class='line'>    <span class="p">.</span><span class="n">asciz</span>   <span class="s">&quot;</span><span class="se">\001</span><span class="s">&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>That <code>___doBlockA_block_invoke_0</code> looks suspiciously like the actual block implementation itself, since the block we used was an empty block. This function just returns straight away, exactly how we&rsquo;d expect an empty function to be compiled.</p>

<p>Then comes <code>___block_descriptor_tmp</code>. This appears to be another struct, this time with 4 values in it. The second one is <code>20</code> which is how big the <code>___block_literal_global</code> is. Maybe that is a size value then? There&rsquo;s also a C-string called <code>.str</code> which has a value <code>v4@?0</code>. This looks like some form of encoding of a type. That might be an encoding of the block type (i.e. it returns void and takes no parameters). The other values I have no idea about.</p>

<h2>But the source is out there, isn&rsquo;t it?</h2>

<p>Yes, the source is out there! It&rsquo;s part of the <code>compiler-rt</code> project within LLVM. Trawling through the code I found the following definitions within <a href="https://llvm.org/svn/llvm-project/compiler-rt/trunk/BlocksRuntime/Block_private.h">Block_private.h</a>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="k">struct</span> <span class="n">Block_descriptor</span> <span class="p">{</span>
</span><span class='line'>    <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">int</span> <span class="n">reserved</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">int</span> <span class="n">size</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">copy</span><span class="p">)(</span><span class="kt">void</span> <span class="o">*</span><span class="n">dst</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="n">src</span><span class="p">);</span>
</span><span class='line'>    <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">dispose</span><span class="p">)(</span><span class="kt">void</span> <span class="o">*</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="k">struct</span> <span class="n">Block_layout</span> <span class="p">{</span>
</span><span class='line'>    <span class="kt">void</span> <span class="o">*</span><span class="n">isa</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">int</span> <span class="n">flags</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">int</span> <span class="n">reserved</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">invoke</span><span class="p">)(</span><span class="kt">void</span> <span class="o">*</span><span class="p">,</span> <span class="p">...);</span>
</span><span class='line'>    <span class="k">struct</span> <span class="n">Block_descriptor</span> <span class="o">*</span><span class="n">descriptor</span><span class="p">;</span>
</span><span class='line'>    <span class="cm">/* Imported variables. */</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Those look awfully familiar! The <code>Block_layout</code> struct is what our <code>___block_literal_global</code> is and the <code>Block_descriptor</code> struct is what our <code>___block_descriptor_tmp</code> is. And look, I was right about the size being the 2nd value of the descriptor. The bit that&rsquo;s slightly strange is the 3rd and 4th values of the <code>Block_descriptor</code>. These look like they should be function pointers but in our compiled case they seemed to be 2 strings. I&rsquo;ll ignore that little point for now.</p>

<p>The <code>isa</code> of <code>Block_layout</code> is interesting as that must be what <code>_NSConcreteGlobalBlock</code> is and also must be how a block can emulate being an Objective-C object. If <code>_NSConcreteGlobalBlock</code> is a <code>Class</code> then the Objective-C message dispatch system will happily treat a block object as a normal object. This is similar to how toll-free bridging works. For more information on that side of things, have a read of Mike Ash&rsquo;s excellent <a href="http://www.mikeash.com/pyblog/friday-qa-2010-01-22-toll-free-bridging-internals.html">blog post about it</a>.</p>

<p>Having pieced all that together, the compiler looks like it&rsquo;s treating the code as something like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='obj-c'><span class='line'><span class="cp">#import &lt;dispatch/dispatch.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="n">__attribute__</span><span class="p">((</span><span class="n">noinline</span><span class="p">))</span>
</span><span class='line'><span class="kt">void</span> <span class="n">runBlockA</span><span class="p">(</span><span class="k">struct</span> <span class="n">Block_layout</span> <span class="o">*</span><span class="n">block</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">block</span><span class="o">-&gt;</span><span class="n">invoke</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">block_invoke</span><span class="p">(</span><span class="k">struct</span> <span class="n">Block_layout</span> <span class="o">*</span><span class="n">block</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// Empty block function</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">doBlockA</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">struct</span> <span class="n">Block_descriptor</span> <span class="n">descriptor</span><span class="p">;</span>
</span><span class='line'>    <span class="n">descriptor</span><span class="o">-&gt;</span><span class="n">reserved</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="n">descriptor</span><span class="o">-&gt;</span><span class="n">size</span> <span class="o">=</span> <span class="mi">20</span><span class="p">;</span>
</span><span class='line'>    <span class="n">descriptor</span><span class="o">-&gt;</span><span class="n">copy</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span><span class='line'>    <span class="n">descriptor</span><span class="o">-&gt;</span><span class="n">dispose</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">struct</span> <span class="n">Block_layout</span> <span class="n">block</span><span class="p">;</span>
</span><span class='line'>    <span class="n">block</span><span class="o">-&gt;</span><span class="n">isa</span> <span class="o">=</span> <span class="n">_NSConcreteGlobalBlock</span><span class="p">;</span>
</span><span class='line'>    <span class="n">block</span><span class="o">-&gt;</span><span class="n">flags</span> <span class="o">=</span> <span class="mi">1342177280</span><span class="p">;</span>
</span><span class='line'>    <span class="n">block</span><span class="o">-&gt;</span><span class="n">reserved</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="n">block</span><span class="o">-&gt;</span><span class="n">invoke</span> <span class="o">=</span> <span class="n">block_invoke</span><span class="p">;</span>
</span><span class='line'>    <span class="n">block</span><span class="o">-&gt;</span><span class="n">descriptor</span> <span class="o">=</span> <span class="n">descriptor</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">runBlockA</span><span class="p">(</span><span class="o">&amp;</span><span class="n">block</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>That&rsquo;s good to know. It makes a lot more sense now what&rsquo;s going on under the hood of blocks.</p>

<h2>What&rsquo;s next?</h2>

<p>Next up I will take a look at a block that takes a parameter and a block that captures variables from the enclosing scope. These will surely make things a bit different! So, watch this space for more.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[What I like about my accountants, Crunch]]></title>
    <link href="http://www.galloway.me.uk/2012/10/what-i-like-about-my-accountants/"/>
    <updated>2012-10-11T11:07:00+01:00</updated>
    <id>http://www.galloway.me.uk/2012/10/what-i-like-about-my-accountants</id>
    <content type="html"><![CDATA[<p>Ever since I set up my app development company, <a href="http://www.swipestack.com/">Swipe Stack Ltd</a> I have had the pleasure of using <a href="http://www.crunch.co.uk/?a_aid=swipestack">Crunch</a> as my accountants. Put simply, they are fantastic. But why do I think that you may ask. Well here are a few reasons why I like them so much.</p>

<p><a href="http://affiliatenetwork.crunch.co.uk/scripts/click.php?a_aid=swipestack&amp;a_bid=55c2e233" target="_top"><img src="http://affiliatenetwork.crunch.co.uk/accounts/default1/banners/300x250-creative2.gif" alt="Crunch, save time, save tax, save money" title="Crunch, save time, save tax, save money" width="300" height="250" /></a><img style="border:0" src="http://affiliatenetwork.crunch.co.uk/scripts/imp.php?a_aid=swipestack&amp;a_bid=55c2e233" width="1" height="1" alt="" /></p>

<!--more-->


<ol>
<li><p> <strong>They provide a very cheap service for forming a limited company.</strong> OK, it&rsquo;s not that hard to set up a limited company but if you&rsquo;re new to it all then this can be a bit daunting. Crunch have a sister company called <a href="https://golimited.co/?aid=swipestack">GoLimited</a> who can set up a company for you for just £13 inc. VAT. This is cheap for a company formation agency. A lot will charge you many times this amount.</p></li>
<li><p> <strong>They are extremely quick at replying to queries.</strong> I usually email a couple of times each month about various little niggly questions I have. For example how I should go about getting paid from the US for some work in a tax effective manner. One of my dedicated team of accountants will reply to me within a day or two and tell me in-depth information about the best way of going about my business. I guess that one major reason people would be hesitant of <a href="http://www.crunch.co.uk/?a_aid=swipestack">Crunch</a> is that they feel they won&rsquo;t be able to get hold of anyone who knows them personally. This is truly not the case. When I deal with them I feel they remember me completely even though I am just one person in a big list of their clients. Their accountants and account managers really do a great job of remembering me!</p></li>
<li><p> <strong>Their online book keeping software is excellent.</strong> One of the doubts I had about <a href="http://www.crunch.co.uk/?a_aid=swipestack">Crunch</a> was the fact that they used their own bespoke online software for bookkeeping. This means that you personally have to enter your invoices and expenses and then they do the rest from the data you give them. This can sound like a lot of work compared to just dumping your invoices and receipts in a shoe box to your accountants. But really, the <a href="http://www.crunch.co.uk/?a_aid=swipestack">Crunch</a> online software is fantastic. Entering an invoice or an expense is very easy and you get profit &amp; loss reports at the click of a button to give you up-to-date information about you business.</p></li>
<li><p> <strong>They integrate with my bank.</strong> A brilliant feature introduced since I signed up to <a href="http://www.crunch.co.uk/?a_aid=swipestack">Crunch</a> is the ability to link my HSBC bank account directly. They do this through a third party company which then sends on the transactions that happen in my account directly into Crunch. This makes life so much easier as I can quickly reconcile every transaction in my bank account with my invoices &amp; expenses. This helps me keep on top of incomings and outgoings.</p></li>
</ol>


<p>They&rsquo;re just a few reasons why I like <a href="http://www.crunch.co.uk/?a_aid=swipestack">Crunch</a> so much, but I do urge you to give them a try if you&rsquo;re thinking of changing accountants or setting up a new business. They have a free trial period in which you can make full use of their software and talk to them about how they can help you.</p>

<p><a href="http://affiliatenetwork.crunch.co.uk/scripts/click.php?a_aid=swipestack&amp;a_bid=7d9a6451" target="_top"><img src="http://affiliatenetwork.crunch.co.uk/accounts/default1/banners/300x250-creative8.gif" alt="Crunch, save time, save tax, save money" title="Crunch, save time, save tax, save money" width="300" height="250" /></a><img style="border:0" src="http://affiliatenetwork.crunch.co.uk/scripts/imp.php?a_aid=swipestack&amp;a_bid=7d9a6451" width="1" height="1" alt="" /></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Character encoding for iOS developers. Or UTF-8 what now?]]></title>
    <link href="http://www.galloway.me.uk/2012/10/character-encoding-for-ios-developers-utf8/"/>
    <updated>2012-10-09T22:30:00+01:00</updated>
    <id>http://www.galloway.me.uk/2012/10/character-encoding-for-ios-developers-utf8</id>
    <content type="html"><![CDATA[<p>Character encoding is a really tricky thing to get your head around. You think in terms of characters usually and as a programmer, that serves you well since everything you type will almost certainly from the standard latin alphabet (i.e. a-z, A-z, 0-9 with punctuation marks). It is this set of characters which was first available for use in computers back in the day, but now that computing is worldwide, we needed a means to display characters from all the world&rsquo;s many languages.</p>

<p>You will no doubt end up dealing with characters (or more likely strings of characters) if you interface with public services where people themselves create the content such as Twitter or Facebook. In this post I aim to explain all you need to know about character encoding from the perspective of an iOS (or Mac) developer.</p>

<!--more-->


<h2>In the beginning there was ASCII</h2>

<p>One of the first things computers needed to be able to do was to store, print and communicate text. This led to the invention of a standard way of encoding text such that all computers could talk to each other and understand each other and it was called ASCII. In short, ASCII is a 7-bit encoding which can therefore encode a total of 128 different characters which is enough to cover the standard latin alphabet. Each character is given a different value including some control characters such as the new line or tab characters. There&rsquo;s other control characters which I won&rsquo;t go into, but if you want then you can read more about them over at <a href="http://en.wikipedia.org/wiki/ASCII">Wikipedia</a>. Here&rsquo;s a table of those characters:</p>

<p><img src="http://www.galloway.me.uk/media/images/2012-07-25-character-encoding-for-ios-developers-utf8/ASCII_code_chart.png" title="&#34;ASCII table&#34;" alt="&#34;ASCII table&#34;"></p>

<p>The column represents the lower 4 bits and the row represents the upper 3 bits. So for example <code>W</code> is <code>0x57</code>. This is all well and good but what about other languages&#8217; characters then? What about all those Chinese, Japanese and chickens (yep, you may want to display this &ldquo;character&rdquo; &ndash; 🐔) out there?! Well that&rsquo;s where unicode comes in!</p>

<h2>Along comes Unicode</h2>

<p>Unicode solved the problem of needing to represent more than just the latin set of characters. It aims to define every possible character you could ever want to represent. Each of these characters is called a <em>code-point</em> and each has a unique 32-bit number to represent it within the unicode space. For instance here are some of the code points:</p>

<ul>
<li>A = U+41</li>
<li>b = U+62</li>
<li>! = U+21</li>
<li>三 = U+4E09</li>
<li>💩 = U+1F4A9</li>
<li>🐔 = U+1F414</li>
</ul>


<p>If you look back up to the ASCII table, you&rsquo;ll notice a distinct similarity between the code-point value of the first 3 (the only ones contained within ASCII) and their ASCII value. The is because all ASCII characters are placed within the Unicode space at their ASCII values, to aid backwards compatibility.</p>

<h2>Character Encoding</h2>

<p>The Unicode standard also defines different standard character encodings. These are crucial standards so that computers can talk to one another and information can be exchanged. They define the way in which you represent in binary, each code-point. ASCII itself is an encoding. So if you wanted to send the word <code>Hello</code> you would send <code>01001000 01100101 01101100 01101100 01101111</code> down the wire.</p>

<p><strong>NB:</strong> This is slightly simplified with regard ASCII. There are a few different variants of it. See <a href="http://en.wikipedia.org/wiki/ASCII">Wikipedia</a> for further information.</p>

<p>However, this encoding only supports the ASCII range and not the full unicode range. That&rsquo;s where UTF-8 and friends come in&hellip;</p>

<h3>UTF-8</h3>

<p>UTF-8 is a character encoding that can represent the full Unicode range. It does this by using variable width blocks to represent single codepoints. It does this by adopting a clever mechanism whereby the first bits of each byte can be examined to determine how wide the block is, according to the following table:</p>

<table>
<thead>
<tr>
<th> First byte </th>
<th> Width</th>
</tr>
</thead>
<tbody>
<tr>
<td> <code>0xxxxxxx</code> </td>
<td> 1</td>
</tr>
<tr>
<td> <code>110xxxxx</code> </td>
<td> 2</td>
</tr>
<tr>
<td> <code>1110xxxx</code> </td>
<td> 3</td>
</tr>
<tr>
<td> <code>11110xxx</code> </td>
<td> 4</td>
</tr>
<tr>
<td> <code>111110xx</code> </td>
<td> 5</td>
</tr>
<tr>
<td> <code>1111110x</code> </td>
<td> 6</td>
</tr>
</tbody>
</table>


<p>All subsequent bytes in a block start with <code>10</code>. So for example a block of width 3 would be <code>1110xxxx 10xxxxxx 10xxxxxx</code>. All the <code>x</code>&rsquo;s in that are then up for grabs to represent a codepoint. So for blocks of width 3, codepoints up to 16 bits can be represented &ndash; i.e. up to U+FFFF.</p>

<p>If you look carefully you will notice that UTF-8 is entirely compatible with ASCII. This means that if there&rsquo;s a document encoded in ASCII, then a reader configured to read as UTF-8 will parse it absolutely fine. That&rsquo;s useful isn&rsquo;t it!</p>

<p>As an example, consider the phrase <code>Hello 🐔三💩</code>. Let&rsquo;s try to work out how that should be encoded:</p>

<table>
<thead>
<tr>
<th> Char </th>
<th> Codepoint </th>
<th> UTF-8 Binary </th>
<th> UTF-8 Hex</th>
</tr>
</thead>
<tbody>
<tr>
<td> H    </td>
<td> U+48      </td>
<td> 01001000 </td>
<td> 0x48</td>
</tr>
<tr>
<td> e    </td>
<td> U+65      </td>
<td> 01100101 </td>
<td> 0x65</td>
</tr>
<tr>
<td> l    </td>
<td> U+6C      </td>
<td> 01101100 </td>
<td> 0x6C</td>
</tr>
<tr>
<td> l    </td>
<td> U+6C      </td>
<td> 01101100 </td>
<td> 0x6C</td>
</tr>
<tr>
<td> o    </td>
<td> U+6F      </td>
<td> 01101111 </td>
<td> 0x6F</td>
</tr>
<tr>
<td> &lt;space&gt; </td>
<td> U+20      </td>
<td> 00100000 </td>
<td> 0x20</td>
</tr>
<tr>
<td> 🐔    </td>
<td> U+1F414   </td>
<td> 11110000 10011111 10010000 10010100 </td>
<td> 0xF0 0x9F 0x90 0x94</td>
</tr>
<tr>
<td> 三    </td>
<td> U+4E09    </td>
<td> 11100100 10111000 10001001 </td>
<td> 0xE4 0xB8 0x89</td>
</tr>
<tr>
<td> 💩    </td>
<td> U+1F4A9   </td>
<td> 11110000 10011111 10010010 10101001 </td>
<td> 0xF0 0x9F 0x92 0xA9</td>
</tr>
</tbody>
</table>


<p>Considering the chicken, U+1F414, look at the UTF-8 binary:</p>

<p><code>11110000 10011111 10010000 10010100</code></p>

<p>Removing all of the prefix bits from each byte you end up with:</p>

<p><code>000 011111 010000 010100</code></p>

<p>As you&rsquo;ll see, this is <code>0x1F414</code>, i.e. the codepoint for the chicken.</p>

<p>Well that&rsquo;s UTF-8 for you. Pretty simple eh? There&rsquo;s really not much more to it than that, but if you do want to read up about some more subtleties then check out <a href="http://en.wikipedia.org/wiki/Utf-8">Wikipedia</a>.</p>

<p>Now onto some more encodings.</p>

<h3>UTF-16</h3>

<p>UTF-16 is another encoding in the same range as UTF-8, however each and every block in UTF-16 is exactly 2 bytes, 16 bits. This means it is trivial to encode all the codepoints up to U+FFFF but what about codepoints above that you may ask. Well, that&rsquo;s where the concept of <strong>surrogate pairs</strong> comes in. These are special pairs of codepoints which when put next to each other represent a higher codepoint. The process goes like this:</p>

<ol>
<li> Subtract <code>0x10000</code> from the codepoint.</li>
<li> Consider the remainder as a 20-bit number.</li>
<li> Of the remaining bits of the codepoint, add <code>0xD800</code> to the top ten bits. This becomes the first part of the surrogate pair.</li>
<li> Add <code>0xDC00</code> to the bottom ten bits. This becomes the second part of the surrogate pair.</li>
</ol>


<p>For example, consider the 🐔 character again. This is codepoint U+1F414. So subtracting 0x10000 leaves 0xF414. The top ten bits are <code>0000111101</code> which is <code>0x3D</code> leading to a first surrogate of <code>0xD83D</code>. The bottom ten bits are <code>0000010100</code> which is <code>0x14</code> leading to a second surrogate of <code>0xDC14</code>. So in UTSF-14, the chicken character is encoding as <code>0xD83D 0xDC14</code>.</p>

<p>You may now be wondering what happens to a codepoint such as <code>0xD800</code> in UTF-16. Well, that&rsquo;s why the range U+D800 to U+DFFF is reserved in Unicode, so that UTF-16 can use those values for this surrogate pairs scheme.</p>

<h2>What now?</h2>

<p>So why should you care about all this as an iOS developer? Well, you just should. You will very likely at some point in your iOS development get data in from a web service. This is highly likely to be encoding using something like JSON, which just so happens to be a text based encoding. The text itself is of course encoded using a character encoding. The bytes will usually come down the wire to you and pop up in your app as an instance of NSData. You&rsquo;ll then turn it into a string using NSString&rsquo;s <code>initWithData:encoding:</code> method. And notice the 2nd parameter &ndash; encoding! That&rsquo;s where you need to know what the encoding is. Although, in reality, you usually just assume UTF-8 since that is by far the most common encoding. Of course really you should work it out properly using something like the Content-Type HTTP header field on the response if using HTTP to transfer the data.</p>

<p>Well, I&rsquo;d really love to explain more stuff about this, but I don&rsquo;t have the time right now. Hopefully I&rsquo;ll get a chance soon to give some more examples and flesh this post out.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Sales increased since iOS 6]]></title>
    <link href="http://www.galloway.me.uk/2012/10/sales-increased-since-ios-6/"/>
    <updated>2012-10-09T21:36:00+01:00</updated>
    <id>http://www.galloway.me.uk/2012/10/sales-increased-since-ios-6</id>
    <content type="html"><![CDATA[<p>A lot of people have been complaining about the new App Store layout in iOS 6. Some developers have particularly been complaining about the fact that their sales are going to drop because it makes it harder for people to find their apps. However, I&rsquo;ve seen completely the opposite. My sales are steadily increasing.</p>

<p>The main app that I&rsquo;ve seen this in is my iOS app called <a href="http://clkuk.tradedoubler.com/click?p=23708&amp;a=1613651&amp;url=http%3A%2F%2Fitunes.apple.com%2Fgb%2Fapp%2Fsubnet-calc%2Fid295652242%3Fmt%3D8%26uo%3D4%26partnerId%3D2003">Subnet Calc</a>. I&rsquo;ve seen an increase in sales of around 25-30 per day to 55 per day, in a steadily increasing fashion. This increase started the day iOS 6 came out.</p>

<!--more-->


<p>Take a look at the graph below which shows a 14 day rolling average of daily sales over the past couple of months. Notice the flat line before iOS 6 launch and then the distinct increase.</p>

<p><img src="http://www.galloway.me.uk/media/images/2012-10-09-sales-increased-since-ios-6/Subnet_Calc_sales.png" alt="Subnet Calc sales since iOS 6" /></p>

<p>I also have a paid version of the app, called <a href="http://clkuk.tradedoubler.com/click?p=23708&amp;a=1613651&amp;url=http%3A%2F%2Fitunes.apple.com%2Fgb%2Fapp%2Fsubnet-calc-pro%2Fid303555213%3Fmt%3D8%26uo%3D4%26partnerId%3D2003">Subnet Calc Pro</a> which has also seen an increase in sales. This is likely due to the fact that as more people download Subnet Calc, more will see the pro version as well.</p>

<p>So, it&rsquo;s not all doom and gloom with the new App Store style. For every person who sees sales reduce, there&rsquo;ll be someone who sees sales increase. Thankfully for me, my app appears first when you search for &ldquo;Subnet Calc&rdquo;. There&rsquo;s tonnes of copy apps (some even stole my name) and this new layout puts mine infront of them which is great.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Facebook World Hack London - Winners!]]></title>
    <link href="http://www.galloway.me.uk/2012/09/facebook-world-hack-london-winners/"/>
    <updated>2012-09-23T19:37:00+01:00</updated>
    <id>http://www.galloway.me.uk/2012/09/facebook-world-hack-london-winners</id>
    <content type="html"><![CDATA[<p>On Friday (21st September 2012), myself and 4 friends attended the Facebook World Hack day in London. It was held in the London offices of Facebook and around 200 people attended. <a href="http://www.twilio.com">Twilio</a>, <a href="http://pusher.com">Pusher</a> and <a href="http://www.deezer.com/">Deezer</a> were also there. The aim was to build something which used the Facebook APIs, with extra points going to teams who incorporated the <a href="http://developers.facebook.com/docs/opengraph/">OpenGraph</a>, a game element or used one of the 3 other companies APIs.</p>

<p>So myself, <a href="https://twitter.com/michaelslater">Michael</a>, <a href="https://twitter.com/ishra">Chris</a>, <a href="https://twitter.com/netproteus">Will</a> and <a href="https://twitter.com/stephenoldham">Stevo</a> set about working on the basic idea we had gone to the day with. The idea was called &ldquo;Flash Dance&rdquo; and it was to be an app that allowed you to arrange silent discos in a flash mob kind of way.</p>

<p>And so, Flash Dance was born&hellip;</p>

<p><img src="http://www.galloway.me.uk/media/images/2012-09-23-facebook-world-hack-london-winners/flash_dance_icon.jpg" alt="Flash Dance Icon" /></p>

<!--more-->


<p>We first got set up in the VW campervan tent that Facebook had put up in the office and started to sketch out the idea. It slowly grew into a fully fledged app plan and then we got hacking for real. Here&rsquo;s a picture of the inside of the tent before any hacking went on:</p>

<p><img src="http://www.galloway.me.uk/media/images/2012-09-23-facebook-world-hack-london-winners/inside_of_van.jpg" alt="Campervan Tent" /></p>

<p>As the day went on we realised we were not going to get the whole lot finished, so we decided to concentrate on the bits that were important. There needed to be a way to create a flash dance and a way to join a flash dance. Those bits didn&rsquo;t need to look pretty, but they needed to be functional. That said, Stevo did a ridiculously great job at making it look pretty, just look at the poster he came up with:</p>

<p><img src="http://www.galloway.me.uk/media/images/2012-09-23-facebook-world-hack-london-winners/flash_dance_big.jpg" alt="Flash Dance" /></p>

<p>And here are some screenshots of what our app turned out like:</p>

<p><img src="http://www.galloway.me.uk/media/images/2012-09-23-facebook-world-hack-london-winners/flash_dance_screenshot_1.jpg" alt="Login screenshot" /></p>

<p><img src="http://www.galloway.me.uk/media/images/2012-09-23-facebook-world-hack-london-winners/flash_dance_screenshot_2.jpg" alt="Map screenshot" /></p>

<p><img src="http://www.galloway.me.uk/media/images/2012-09-23-facebook-world-hack-london-winners/flash_dance_screenshot_3.jpg" alt="Create dance screenshot" /></p>

<p>So with our app in hand and Michael primed for presentation it came to the bit of the evening where we were to show what we&rsquo;d done. We did a great presentation and got a lot of laughs out of it which was awesome. Here&rsquo;s what the presentation part of the evening looked like (this wasn&rsquo;t us &ndash; we were likely still working hard at this point!):</p>

<p><img src="http://www.galloway.me.uk/media/images/2012-09-23-facebook-world-hack-london-winners/presentations.jpg" alt="Presentations" /></p>

<p>There were 7 prizes up for grabs:</p>

<ul>
<li>Best use of Twilio</li>
<li>Best use of Pusher</li>
<li>Best use of Deezer</li>
<li>Best use of OpenGraph</li>
<li>Best use of mobile</li>
<li>Best use of gaming</li>
<li>Best overall</li>
</ul>


<p>And well, our day couldn&rsquo;t really have gone much better since <strong>WE WON THE BEST OVERALL PRIZE</strong>! Our prize was an iPad (16GB WiFi) and $250 Facebook advertising credit. We were all ridiculously pleased but also we all have iPads already so we&rsquo;re going to sell it.</p>

<p>We are also going to finish the app and launch it hopefully in the coming months. It needs a lot of tidying up and some big decisions are to be made. But fingers crossed it&rsquo;ll all work out fine!</p>

<p>I want to say a final thankyou to Facebook for hosting the event. It was AWESOME.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[iOS 6 by Tutorials]]></title>
    <link href="http://www.galloway.me.uk/2012/09/ios-6-by-tutorials/"/>
    <updated>2012-09-19T20:02:00+01:00</updated>
    <id>http://www.galloway.me.uk/2012/09/ios-6-by-tutorials</id>
    <content type="html"><![CDATA[<p>For the past few months (since WWDC) I&rsquo;ve been co-authoring a fantastic book called <a href="http://www.raywenderlich.com/store/ios-6-by-tutorials?source=swipestack">iOS 6 by Tutorials</a>. And today I can announce that we have finally been able to release it now that Apple&rsquo;s iOS 6 NDA has been released!</p>

<p><img src="http://www.galloway.me.uk/media/images/2012-09-19-ios-6-by-tutorials/iOS6_by_Tutorials.jpg" alt="iOS 6 by Tutorials" /></p>

<!--more-->


<p>The book covers a ridiculous number of things. Here&rsquo;s the outline (with the chapters I wrote in bold):</p>

<ul>
<li>Modern Objective-C</li>
<li>Auto Layout</li>
<li><strong>UICollectionView</strong></li>
<li>Passbook</li>
<li>In-App Purchase</li>
<li>Social Framework</li>
<li>Challenges with GameKit</li>
<li>Attributed Strings</li>
<li>State Preservation and Restoration</li>
<li>What&rsquo;s New with Cocoa Touch</li>
<li>What&rsquo;s New with Storyboards</li>
<li>What&rsquo;s New with UI Customisation</li>
<li><strong>What&rsquo;s New with MapKit</strong></li>
<li>What&rsquo;s New with EventKit</li>
<li>What&rsquo;s New with CoreImage</li>
<li>Automated Testing</li>
<li>Accessibility</li>
<li><strong>Secrets of Info.plist</strong></li>
</ul>


<p>The book weighs in at over 1500 pages so it&rsquo;s <strong>well</strong> worth the money. In fact for a short time it&rsquo;s worth it even more since it&rsquo;s on sale at only $44! Grab it now before it goes up in price.</p>

<p>Also, there is what we&rsquo;re calling an <a href="http://www.raywenderlich.com/20912/introducing-the-ios-6-feast">&ldquo;iOS 6 Feast&rdquo;</a>. This is a whole load of free stuff from site including tutorials, updated tutorials and even some stuff we&rsquo;re giving away!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Hacking up an armv7s library]]></title>
    <link href="http://www.galloway.me.uk/2012/09/hacking-up-an-armv7s-library/"/>
    <updated>2012-09-13T16:06:00+01:00</updated>
    <id>http://www.galloway.me.uk/2012/09/hacking-up-an-armv7s-library</id>
    <content type="html"><![CDATA[<p><strong>NOTE: Please take care with this. I obviously cannot test if this will actually work on a new iPhone 5 device! I provide no warranty if you submit having used this and it doesn&rsquo;t actually work on the new device. Please think twice before submitting an app which you have used this method to create. You don&rsquo;t have to submit an <code>armv7s</code> binary. Just set your &ldquo;Architectures&rdquo; build setting to <code>armv7</code> only and submit the resulting binary.</strong></p>

<p><strong>UPDATE: It worked! I tested an app that I&rsquo;d used this method to build an <code>armv7s</code> slice with. It ran fine on my iPhone 5 :-D.</strong></p>

<p>Well the iPhone 5 has been announced and it just so happens that the architecture it uses is what they&rsquo;re calling <code>armv7s</code>. This brings in yet another architecture to the mix alongside <code>armv6</code> and <code>armv7</code>. And I bet you are wondering why you&rsquo;re getting linker errors when building for <code>armv7s</code> when using external libraries. It&rsquo;s because those external libraries do not have <code>armv7s</code> versions!</p>

<p>If you run <code>file</code> on the library then you&rsquo;ll see that there is no <code>armv7s</code> version. For example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>file libUAirship-1.2.1.a
</span><span class='line'>libUAirship-1.2.1.a: Mach-O universal binary with 3 architectures
</span><span class='line'>libUAirship-1.2.1.a <span class="o">(</span><span class="k">for </span>architecture armv7<span class="o">)</span>:    current ar archive random library
</span><span class='line'>libUAirship-1.2.1.a <span class="o">(</span><span class="k">for </span>architecture armv6<span class="o">)</span>:    current ar archive random library
</span><span class='line'>libUAirship-1.2.1.a <span class="o">(</span><span class="k">for </span>architecture i386<span class="o">)</span>: current ar archive random library
</span></code></pre></td></tr></table></div></figure>


<p>So what can you do? You could wait for the library to be updated, or you could just follow these steps&hellip;</p>

<!--more-->


<h2>So what&rsquo;s the deal?</h2>

<p>Well, the problem is that when the linker does its merry business linking together all your object files, it is told what architecture to link for. Each of your libraries&#8217; <code>.a</code> files will most likely be what are called &ldquo;fat&rdquo; meaning they have more than one architecture in them. But the linker won&rsquo;t be able to find the <code>armv7s</code> version since it doesn&rsquo;t exist in there.</p>

<p>But, we know that <code>armv7s</code> is a superset of <code>armv7</code> (it&rsquo;s just got a new version of the floating point unit so only adds new instructions). So what we can do is to copy the <code>armv7</code> part of the library and add it again but tell it that it&rsquo;s for <code>armv7s</code>. That sounds simple, but there&rsquo;s more to it than that.</p>

<p>Inside each architecture&rsquo;s portion of the fat library is something called an object file archive. This contains a collection of <code>.o</code> files that were combined together to form the library. Inside each <code>.o</code> is the code for each method. The linker uses these to build the final app binary, picking all the methods it needs to create the app. The problem is that these <code>.o</code> files also have a header to say what architecture they&rsquo;re for.</p>

<p>Inside this header (called a Mach-O header) is a field for the CPU type and the CPU subtype. ARM is CPU type 12, armv7 is CPU subtype 9 and armv7s is CPU subtype 11. So, all we need to do is toggle all the 9s to 11s, right? Yup! But that&rsquo;s easier said than done.</p>

<p>My solution is a script that strips out the <code>armv7</code> portion of the fat library and then unpacks the archive into its constituent <code>.o</code> files. Then I wrote a little C program to do the 9 => 11 toggling which is run on each of the <code>.o</code> files. Then finally the new <code>.o</code> files are packaged up into a new portion which is re-added to the fat library.</p>

<p>Simple!</p>

<p>So, if you&rsquo;re ready to get going then read on&hellip;</p>

<h2>Do you need this to submit an app?</h2>

<p><strong>No</strong>.</p>

<p>Do not use this unless you really understand what you&rsquo;re doing. You <strong>do not need</strong> to submit with an <code>armv7s</code> binary. Just set your <strong>Architectures</strong> build setting to <code>armv7</code> only and submit the resulting binary.</p>

<h2>A program you&rsquo;ll need</h2>

<p>The first thing you&rsquo;ll need is the following program written in C:</p>

<figure class='code'><figcaption><span>armv7sconvert.c</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="cm">/*</span>
</span><span class='line'><span class="cm"> * armv7sconvert &lt;infile&gt; &lt;outfile&gt;</span>
</span><span class='line'><span class="cm"> * Switches CPU subsystem type to armv7s</span>
</span><span class='line'><span class="cm"> *</span>
</span><span class='line'><span class="cm"> * By Matt Galloway - http://www.galloway.me.uk</span>
</span><span class='line'><span class="cm"> * </span>
</span><span class='line'><span class="cm"> * Based on g3spot.c from http://redbutton.sourceforge.net (c) Simon Kilvington, 2009</span>
</span><span class='line'><span class="cm"> */</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#include &lt;stdio.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;stdlib.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;stdarg.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;string.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;errno.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;mach-o/loader.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="n">fatal</span><span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="n">msg</span><span class="p">,</span> <span class="p">...);</span>
</span><span class='line'><span class="kt">void</span> <span class="nf">fatal</span><span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="n">msg</span><span class="p">,</span> <span class="p">...)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kt">va_list</span> <span class="n">ap</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">va_start</span><span class="p">(</span><span class="n">ap</span><span class="p">,</span> <span class="n">msg</span><span class="p">);</span>
</span><span class='line'>  <span class="n">vfprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">ap</span><span class="p">);</span>
</span><span class='line'>  <span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="n">va_end</span><span class="p">(</span><span class="n">ap</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">exit</span><span class="p">(</span><span class="n">EXIT_FAILURE</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">argc</span> <span class="o">!=</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="n">fatal</span><span class="p">(</span><span class="s">&quot;Syntax: %s &lt;in_file&gt; &lt;out_file&gt;&quot;</span><span class="p">,</span> <span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kt">char</span> <span class="o">*</span><span class="n">inName</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
</span><span class='line'>  <span class="kt">char</span> <span class="o">*</span><span class="n">outName</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">FILE</span> <span class="o">*</span><span class="n">inFile</span> <span class="o">=</span> <span class="n">fopen</span><span class="p">(</span><span class="n">inName</span><span class="p">,</span> <span class="s">&quot;r&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">inFile</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="n">fatal</span><span class="p">(</span><span class="s">&quot;Unable to read %s: %s&quot;</span><span class="p">,</span> <span class="n">inName</span><span class="p">,</span> <span class="n">strerror</span><span class="p">(</span><span class="n">errno</span><span class="p">));</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/* find out how big it is */</span>
</span><span class='line'>  <span class="n">fseek</span><span class="p">(</span><span class="n">inFile</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">SEEK_END</span><span class="p">);</span>
</span><span class='line'>  <span class="kt">long</span> <span class="n">size</span> <span class="o">=</span> <span class="n">ftell</span><span class="p">(</span><span class="n">inFile</span><span class="p">);</span>
</span><span class='line'>  <span class="n">rewind</span><span class="p">(</span><span class="n">inFile</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%s: %lu bytes</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">inName</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/* read it all into memory */</span>
</span><span class='line'>    <span class="kt">unsigned</span> <span class="kt">char</span> <span class="o">*</span><span class="n">buf</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="n">size</span><span class="p">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">buf</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="n">fatal</span><span class="p">(</span><span class="s">&quot;Out of memory&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">fread</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">inFile</span><span class="p">)</span> <span class="o">!=</span> <span class="n">size</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="n">fatal</span><span class="p">(</span><span class="s">&quot;Error trying to read %s: %s&quot;</span><span class="p">,</span> <span class="n">inName</span><span class="p">,</span> <span class="n">strerror</span><span class="p">(</span><span class="n">errno</span><span class="p">));</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">fclose</span><span class="p">(</span><span class="n">inFile</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>      <span class="n">fatal</span><span class="p">(</span><span class="s">&quot;Error trying to close %s: %s&quot;</span><span class="p">,</span> <span class="n">inName</span><span class="p">,</span> <span class="n">strerror</span><span class="p">(</span><span class="n">errno</span><span class="p">));</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">struct</span> <span class="n">mach_header</span> <span class="o">*</span><span class="n">mach_hdr</span> <span class="o">=</span> <span class="p">(</span><span class="k">struct</span> <span class="n">mach_header</span> <span class="o">*</span><span class="p">)</span> <span class="p">(</span><span class="n">buf</span><span class="p">);</span>
</span><span class='line'>  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Mach magic: 0x%08x</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">mach_hdr</span><span class="o">-&gt;</span><span class="n">magic</span><span class="p">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">mach_hdr</span><span class="o">-&gt;</span><span class="n">magic</span> <span class="o">!=</span> <span class="n">MH_MAGIC</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="n">fatal</span><span class="p">(</span><span class="s">&quot;Wrong magic number (expecting 0x%08x)&quot;</span><span class="p">,</span> <span class="n">MH_MAGIC</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;CPU type: %d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">ntohl</span><span class="p">(</span><span class="n">mach_hdr</span><span class="o">-&gt;</span><span class="n">cputype</span><span class="p">));</span>
</span><span class='line'>  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;CPU sub-type: %d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">ntohl</span><span class="p">(</span><span class="n">mach_hdr</span><span class="o">-&gt;</span><span class="n">cpusubtype</span><span class="p">));</span>
</span><span class='line'>  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;*** Changing to CPU sub-type 11</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="n">mach_hdr</span><span class="o">-&gt;</span><span class="n">cpusubtype</span> <span class="o">=</span> <span class="mi">11</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Saving as %s</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">outName</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">FILE</span> <span class="o">*</span><span class="n">outFile</span> <span class="o">=</span> <span class="n">fopen</span><span class="p">(</span><span class="n">outName</span><span class="p">,</span> <span class="s">&quot;w&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">outFile</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="n">fatal</span><span class="p">(</span><span class="s">&quot;Unable to write %s: %s&quot;</span><span class="p">,</span> <span class="n">outName</span><span class="p">,</span> <span class="n">strerror</span><span class="p">(</span><span class="n">errno</span><span class="p">));</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">fwrite</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">outFile</span><span class="p">)</span> <span class="o">!=</span> <span class="n">size</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="n">fatal</span><span class="p">(</span><span class="s">&quot;Error trying to write %s: %s&quot;</span><span class="p">,</span> <span class="n">outName</span><span class="p">,</span> <span class="n">strerror</span><span class="p">(</span><span class="n">errno</span><span class="p">));</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">fclose</span><span class="p">(</span><span class="n">outFile</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>      <span class="n">fatal</span><span class="p">(</span><span class="s">&quot;Error trying to close %s: %s&quot;</span><span class="p">,</span> <span class="n">outName</span><span class="p">,</span> <span class="n">strerror</span><span class="p">(</span><span class="n">errno</span><span class="p">));</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="n">EXIT_SUCCESS</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Copy it, and save it as <code>armv7sconvert.c</code>. Then compile it with:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>clang -o armv7sconvert armv7sconvert.c
</span></code></pre></td></tr></table></div></figure>


<p>Then add this to <code>~/bin</code> and add <code>~/bin</code> to your path by editing <code>~/.profile</code> and adding:</p>

<figure class='code'><figcaption><span>~/.profile</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">PATH</span><span class="o">=</span><span class="k">${</span><span class="nv">PATH</span><span class="k">}</span>:<span class="k">${</span><span class="nv">HOME</span><span class="k">}</span>/bin
</span></code></pre></td></tr></table></div></figure>


<h2>A script!</h2>

<p>Now you&rsquo;ll want the script which does the hard work of unpacking the library, running the <code>armv7sconvert</code> over the object files and repacking it. Copy and paste the following into a file called <code>armv7sconvert.sh</code> also in <code>~/bin</code>:</p>

<figure class='code'><figcaption><span>armv7sconvert.sh</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#!/bin/bash</span>
</span><span class='line'>
</span><span class='line'><span class="nv">CONVERT</span><span class="o">=</span><span class="s2">&quot;armv7sconvert&quot;</span>
</span><span class='line'><span class="nv">ARCHIVE</span><span class="o">=</span><span class="s2">&quot;$1&quot;</span>
</span><span class='line'><span class="nv">LIPO</span><span class="o">=</span><span class="s2">&quot;xcrun -sdk iphoneos lipo&quot;</span>
</span><span class='line'><span class="nv">AR</span><span class="o">=</span><span class="s2">&quot;xcrun -sdk iphoneos ar&quot;</span>
</span><span class='line'><span class="nv">TEMP</span><span class="o">=</span><span class="s2">&quot;`mktemp -d -t build`&quot;</span>
</span><span class='line'>
</span><span class='line'>cp <span class="k">${</span><span class="nv">ARCHIVE</span><span class="k">}</span> <span class="k">${</span><span class="nv">TEMP</span><span class="k">}</span>
</span><span class='line'><span class="nb">pushd</span> <span class="k">${</span><span class="nv">TEMP</span><span class="k">}</span>
</span><span class='line'><span class="k">${</span><span class="nv">LIPO</span><span class="k">}</span> -thin armv7 <span class="k">${</span><span class="nv">ARCHIVE</span><span class="k">}</span> -output <span class="k">${</span><span class="nv">ARCHIVE</span><span class="k">}</span>.armv7
</span><span class='line'><span class="k">${</span><span class="nv">AR</span><span class="k">}</span> -x <span class="k">${</span><span class="nv">ARCHIVE</span><span class="k">}</span>.armv7
</span><span class='line'>find . -name <span class="s1">&#39;*.o&#39;</span> -exec <span class="k">${</span><span class="nv">CONVERT</span><span class="k">}</span> <span class="o">{}</span> <span class="o">{}</span>2 <span class="se">\;</span>
</span><span class='line'>rm *.o
</span><span class='line'><span class="k">${</span><span class="nv">AR</span><span class="k">}</span> -r <span class="k">${</span><span class="nv">ARCHIVE</span><span class="k">}</span>.armv7s *.o2
</span><span class='line'>rm *.o2
</span><span class='line'><span class="k">${</span><span class="nv">LIPO</span><span class="k">}</span> -create -arch armv7s <span class="k">${</span><span class="nv">ARCHIVE</span><span class="k">}</span>.armv7s <span class="k">${</span><span class="nv">ARCHIVE</span><span class="k">}</span> -output <span class="k">${</span><span class="nv">ARCHIVE</span><span class="k">}</span>.new
</span><span class='line'><span class="nb">popd</span>
</span><span class='line'>
</span><span class='line'>mv <span class="k">${</span><span class="nv">TEMP</span><span class="k">}</span>/<span class="k">${</span><span class="nv">ARCHIVE</span><span class="k">}</span>.new <span class="k">${</span><span class="nv">ARCHIVE</span><span class="k">}</span>
</span><span class='line'>
</span><span class='line'>rm -rf <span class="k">${</span><span class="nv">TEMP</span><span class="k">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>What this does is a bit magical. I&rsquo;ll explain later when I get chance. But now put this in your path somewhere and call it <code>armv7sconvert.sh</code>. Then run this command on it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>chmod +x armv7sconvert.sh
</span></code></pre></td></tr></table></div></figure>


<h2>Convert those libraries!</h2>

<p>Now go to where your library is located and do this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>armv7sconvert.sh libUAirship-1.2.1.a
</span></code></pre></td></tr></table></div></figure>


<p>That should now have the <code>armv7s</code> portion added to it. To confirm, do:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>file libUAirship-1.2.1.a
</span><span class='line'>libUAirship-1.2.1.a: Mach-O universal binary with 4 architectures
</span><span class='line'>libUAirship-1.2.1.a <span class="o">(</span><span class="k">for </span>architecture cputype <span class="o">(</span>12<span class="o">)</span> cpusubtype <span class="o">(</span>11<span class="o">))</span>:    current ar archive random library
</span><span class='line'>libUAirship-1.2.1.a <span class="o">(</span><span class="k">for </span>architecture armv7<span class="o">)</span>:    current ar archive random library
</span><span class='line'>libUAirship-1.2.1.a <span class="o">(</span><span class="k">for </span>architecture armv6<span class="o">)</span>:    current ar archive random library
</span><span class='line'>libUAirship-1.2.1.a <span class="o">(</span><span class="k">for </span>architecture i386<span class="o">)</span>: current ar archive random library
</span></code></pre></td></tr></table></div></figure>


<p>You should then see <code>armv7</code> and <code>armv7s</code> (or it might just say CPU type 12 and CPU sub-type 11 &mdash; just another name for <code>armv7s</code>).</p>

<h2>And the verdict is&hellip;</h2>

<p>I had an app that I&rsquo;d done this little hack on for 4 libraries it used. I created just an armv7s binary and had it ready and waiting for my iPhone 5 to test on. I tested it and it worked like a dream. No problems what-so-ever. So, I would say that it&rsquo;s a success!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Auto-sorted arrays]]></title>
    <link href="http://www.galloway.me.uk/2012/07/auto-sorted-arrays/"/>
    <updated>2012-07-23T23:08:00+01:00</updated>
    <id>http://www.galloway.me.uk/2012/07/auto-sorted-arrays</id>
    <content type="html"><![CDATA[<p>A problem came up whilst I was hard at work at my current job (iOS developer at <a href="http://www.zeebox.com">zeebox</a>) where I needed a list of things that were going to be displayed in a table. These things were going to be ordered based on time but the API I wanted my table view to have was such that it would be given a chunk of new items to display but it didn&rsquo;t <em>necessarily</em> know where to display them. I would want to animate the changes to the table so when adding a new object I&rsquo;d need to know where they had been added. So I thought to myself:</p>

<blockquote><p>Wouldn&rsquo;t it be nice to have an array which kept itself sorted when you added objects to it and also told you where it had added them?</p></blockquote>

<p>And this is where <a href="https://github.com/mattjgalloway/MJGFoundation/blob/master/Source/Model/MJGSortedMutableArray.h">MJGMutableSortedArray</a> was born&hellip;</p>

<!--more-->


<h2>Why would you want this sort of array?</h2>

<p>Consider a situation where you&rsquo;re showing a objects in a list which have a logical sort order. For example, think of a list of people ordered by their name. You may get an opportunity to add a new object to the array and in the process you want your table view to animate in the change. The usual way of doing this would be the following:</p>

<ol>
<li>Add the new person to your internal storage array of people.</li>
<li>Sort your array of people.</li>
<li>Figure out where the new person ended up.</li>
<li>Perform the animation now that you know the index of the row which has been added.</li>
</ol>


<p>This is quite a time consuming process and we can surely do better, right?</p>

<h2>My solution</h2>

<p>I came up with the idea of an array which you give it a means of ordering itself. Since I wanted compatibility with <code>NSMutableArray</code> I chose to allow the following methods for keeping the array sorted:</p>

<ol>
<li>Using an array of sort descriptors.</li>
<li>Using a comparator block.</li>
<li>Using a callback function.</li>
<li>Using a specific selector.</li>
</ol>


<p>These map nicely to <code>NSMutableArray</code>&rsquo;s <code>sortUsing...</code> method family, which is nice.</p>

<p>So I came up with this initial header file:</p>

<figure class='code'><figcaption><span>MJGMutableSortedArray</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">@interface</span> <span class="nc">MJGSortedMutableArray</span> : <span class="nc">NSObject</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">initWithDescriptors:</span><span class="p">(</span><span class="n">NSArray</span><span class="o">*</span><span class="p">)</span><span class="nv">descriptors</span><span class="p">;</span>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">initWithComparator:</span><span class="p">(</span><span class="n">NSComparator</span><span class="p">)</span><span class="nv">comparator</span><span class="p">;</span>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">initWithFunction:</span><span class="p">(</span><span class="n">NSInteger</span> <span class="p">(</span><span class="o">*</span><span class="p">)(</span><span class="kt">id</span><span class="p">,</span> <span class="kt">id</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="p">))</span><span class="nv">compare</span> <span class="nf">context:</span><span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="p">)</span><span class="nv">context</span><span class="p">;</span>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">initWithSelector:</span><span class="p">(</span><span class="kt">SEL</span><span class="p">)</span><span class="nv">selector</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Great! That&rsquo;s how we&rsquo;d create one of these. But what about the other methods we&rsquo;d want in such an array. The first really important method is the whole reason for creating this class, which is to add an object and find out where in the array the new object was added. It would also be great to be able to remove objects, so I came up with these two methods:</p>

<figure class='code'><figcaption><span>Insertion and deletion methods</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="n">NSUInteger</span><span class="p">)</span><span class="nf">addObject:</span><span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nv">obj</span><span class="p">;</span>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">removeObjectAtIndex:</span><span class="p">(</span><span class="n">NSUInteger</span><span class="p">)</span><span class="nv">index</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And that just leaves implementing it&hellip;</p>

<h2>Implementing it</h2>

<p>Implementing this is actually really straight forward. The only tricky bit is ensuring that the array stays sorted when you add to it. The beauty of only allowing addition of single objects at a time, added to the fact that the method for comparison is decided at initialisation means that you can make the optimisation that you know your array is sorted at all times. So addition of an element is <code>O(n)</code>.</p>

<p>I decided to stick with blocks being the basis of everything and boil all the comparison methods down into <code>NSComparator</code> blocks. So then it makes the <code>addObject:</code> method really simple. I made the class have a comparator and a mutable array internally, which the insertion and deletion methods will act upon. This is what the class continuation category looks like:</p>

<figure class='code'><figcaption><span>MJGMutableSortedArray internals</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">@interface</span> <span class="nc">MJGSortedMutableArray</span> <span class="p">()</span>
</span><span class='line'><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">)</span> <span class="n">NSMutableArray</span> <span class="o">*</span><span class="n">backingArray</span><span class="p">;</span>
</span><span class='line'><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">)</span> <span class="n">NSComparator</span> <span class="n">comparator</span><span class="p">;</span>
</span><span class='line'><span class="k">@end</span>
</span></code></pre></td></tr></table></div></figure>


<p>So then the <code>addObject:</code> method is simply this:</p>

<figure class='code'><figcaption><span>Insertion method</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="n">NSUInteger</span><span class="p">)</span><span class="nf">addObject:</span><span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nv">obj</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">__block</span> <span class="n">NSUInteger</span> <span class="n">addedIndex</span> <span class="o">=</span> <span class="n">NSNotFound</span><span class="p">;</span>
</span><span class='line'>    <span class="p">[</span><span class="n">_backingArray</span> <span class="nl">enumerateObjectsUsingBlock:</span><span class="o">^</span><span class="p">(</span><span class="kt">id</span> <span class="n">obj2</span><span class="p">,</span> <span class="n">NSUInteger</span> <span class="n">idx</span><span class="p">,</span> <span class="kt">BOOL</span> <span class="o">*</span><span class="n">stop</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">NSComparisonResult</span> <span class="n">result</span> <span class="o">=</span> <span class="n">_comparator</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">obj2</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">result</span> <span class="o">!=</span> <span class="n">NSOrderedDescending</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="n">addedIndex</span> <span class="o">=</span> <span class="n">idx</span><span class="p">;</span>
</span><span class='line'>            <span class="p">[</span><span class="n">_backingArray</span> <span class="nl">insertObject:</span><span class="n">obj</span> <span class="nl">atIndex:</span><span class="n">addedIndex</span><span class="p">];</span>
</span><span class='line'>            <span class="o">*</span><span class="n">stop</span> <span class="o">=</span> <span class="n">YES</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}];</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">addedIndex</span> <span class="o">==</span> <span class="n">NSNotFound</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="p">[</span><span class="n">_backingArray</span> <span class="nl">addObject:</span><span class="n">obj</span><span class="p">];</span>
</span><span class='line'>        <span class="n">addedIndex</span> <span class="o">=</span> <span class="p">(</span><span class="n">_backingArray</span><span class="p">.</span><span class="n">count</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">addedIndex</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>It should be fairly easy to convince yourself how this works. It loops over all the objects currently in the array until it hits one where the result of comparing the object to insert with the iterated object is not <code>NSOrderedDescending</code>. The following example should make you understand that:</p>

<pre><code>Current array:     1  4  6  9
Object to insert:  7
Comparison method: NSNumber's compare: method

Iteration 0:       obj2 = 1
                   result = [7 compare:1] = NSOrderedDescending

Iteration 1:       obj2 = 4
                   result = [7 compare:4] = NSOrderedDescending

Iteration 2:       obj2 = 6
                   result = [7 compare:6] = NSOrderedDescending

Iteration 3:       obj2 = 9
                   result = [7 compare:9] = NSOrderedAscending
</code></pre>

<p>In this case we hit the right place to insert when the iteration index was <code>3</code>, since at that point the result of the comparison was <code>NSOrderedAscending</code>. The object would be added at index 3, so the array would then be:</p>

<pre><code>1  4  6  7  9
</code></pre>

<p>This has clearly worked. Woo! Removal is simple:</p>

<figure class='code'><figcaption><span>Removal method</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">removeObjectAtIndex:</span><span class="p">(</span><span class="n">NSUInteger</span><span class="p">)</span><span class="nv">index</span> <span class="p">{</span>
</span><span class='line'>    <span class="p">[</span><span class="n">_backingArray</span> <span class="nl">removeObjectAtIndex:</span><span class="n">index</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Initialising the array with the various options</h2>

<p>That just leaves initialising the array and creating the comparator block. The simple case is the <code>initWithComparator:</code> since the comparator has already been created by the caller for us:</p>

<figure class='code'><figcaption><span>initWithComparator:</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">initWithComparator:</span><span class="p">(</span><span class="n">NSComparator</span><span class="p">)</span><span class="nv">comparator</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">((</span><span class="n">self</span> <span class="o">=</span> <span class="p">[</span><span class="n">self</span> <span class="n">init</span><span class="p">]))</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">self</span><span class="p">.</span><span class="n">comparator</span> <span class="o">=</span> <span class="n">comparator</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">self</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The next easiest is <code>initWithFunction:</code> since that comparator is simple to create:</p>

<figure class='code'><figcaption><span>initWithFunction:</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">initWithFunction:</span><span class="p">(</span><span class="n">NSInteger</span> <span class="p">(</span><span class="o">*</span><span class="p">)(</span><span class="kt">id</span><span class="p">,</span> <span class="kt">id</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="p">))</span><span class="nv">compare</span> <span class="nf">context:</span><span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="p">)</span><span class="nv">context</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">((</span><span class="n">self</span> <span class="o">=</span> <span class="p">[</span><span class="n">self</span> <span class="n">init</span><span class="p">]))</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">self</span><span class="p">.</span><span class="n">comparator</span> <span class="o">=</span> <span class="o">^</span><span class="n">NSComparisonResult</span><span class="p">(</span><span class="kt">id</span> <span class="n">obj1</span><span class="p">,</span> <span class="kt">id</span> <span class="n">obj2</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">compare</span><span class="p">(</span><span class="n">obj1</span><span class="p">,</span> <span class="n">obj2</span><span class="p">,</span> <span class="n">context</span><span class="p">);</span>
</span><span class='line'>        <span class="p">};</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">self</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then comes <code>initWithDescriptors:</code>, which is a bit more complicated. This involves looping through an array of descriptors until one finds the two objects to be different, i.e. don&rsquo;t compare as <code>NSOrderedSame</code>. It should be simple enough to convince yourself that the following implementation gives that:</p>

<figure class='code'><figcaption><span>initWithDescriptors:</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">initWithDescriptors:</span><span class="p">(</span><span class="n">NSArray</span><span class="o">*</span><span class="p">)</span><span class="nv">descriptors</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">((</span><span class="n">self</span> <span class="o">=</span> <span class="p">[</span><span class="n">self</span> <span class="n">init</span><span class="p">]))</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">self</span><span class="p">.</span><span class="n">comparator</span> <span class="o">=</span> <span class="o">^</span><span class="n">NSComparisonResult</span><span class="p">(</span><span class="kt">id</span> <span class="n">obj1</span><span class="p">,</span> <span class="kt">id</span> <span class="n">obj2</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">for</span> <span class="p">(</span><span class="n">NSSortDescriptor</span> <span class="o">*</span><span class="n">descriptor</span> <span class="k">in</span> <span class="n">descriptors</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="n">NSComparisonResult</span> <span class="n">result</span> <span class="o">=</span> <span class="p">[</span><span class="n">descriptor</span> <span class="nl">compareObject:</span><span class="n">obj1</span> <span class="nl">toObject:</span><span class="n">obj2</span><span class="p">];</span>
</span><span class='line'>                <span class="k">if</span> <span class="p">(</span><span class="n">result</span> <span class="o">!=</span> <span class="n">NSOrderedSame</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                    <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
</span><span class='line'>                <span class="p">}</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">NSOrderedSame</span><span class="p">;</span>
</span><span class='line'>        <span class="p">};</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">self</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Finally, that leaves <code>initWithSelector:</code> which is a bit harder. It could be achieved by just using <code>performSelector:</code> but that gives compiler warnings since the compiler cannot know what the return type of the selector is and therefore ARC can&rsquo;t do it&rsquo;s thing (imagine if the selector actually returned an object with a +1 reference count &ndash; it would be leaked as ARC cannot know at compile time that the selector is going to do this). So I decided to use <code>NSInvocation</code>:</p>

<figure class='code'><figcaption><span>initWithSelector:</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">initWithSelector:</span><span class="p">(</span><span class="kt">SEL</span><span class="p">)</span><span class="nv">selector</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">((</span><span class="n">self</span> <span class="o">=</span> <span class="p">[</span><span class="n">self</span> <span class="n">init</span><span class="p">]))</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// 1</span>
</span><span class='line'>        <span class="n">NSMethodSignature</span> <span class="o">*</span><span class="n">methodSignature</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSNumber</span> <span class="nl">instanceMethodSignatureForSelector:</span><span class="k">@selector</span><span class="p">(</span><span class="nl">compare:</span><span class="p">)];</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// 2</span>
</span><span class='line'>        <span class="n">NSInvocation</span> <span class="o">*</span><span class="n">invocation</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSInvocation</span> <span class="nl">invocationWithMethodSignature:</span><span class="n">methodSignature</span><span class="p">];</span>
</span><span class='line'>        <span class="p">[</span><span class="n">invocation</span> <span class="nl">setSelector:</span><span class="n">selector</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// 3</span>
</span><span class='line'>        <span class="n">self</span><span class="p">.</span><span class="n">comparator</span> <span class="o">=</span> <span class="o">^</span><span class="n">NSComparisonResult</span><span class="p">(</span><span class="kt">id</span> <span class="n">obj1</span><span class="p">,</span> <span class="kt">id</span> <span class="n">obj2</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="c1">// 4</span>
</span><span class='line'>            <span class="p">[</span><span class="n">invocation</span> <span class="nl">setTarget:</span><span class="n">obj1</span><span class="p">];</span>
</span><span class='line'>            <span class="p">[</span><span class="n">invocation</span> <span class="nl">setArgument:</span><span class="o">&amp;</span><span class="n">obj2</span> <span class="nl">atIndex:</span><span class="mi">2</span><span class="p">];</span>
</span><span class='line'>            <span class="p">[</span><span class="n">invocation</span> <span class="n">invoke</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// 5</span>
</span><span class='line'>            <span class="n">NSComparisonResult</span> <span class="n">returnValue</span><span class="p">;</span>
</span><span class='line'>            <span class="p">[</span><span class="n">invocation</span> <span class="nl">getReturnValue:</span><span class="o">&amp;</span><span class="n">returnValue</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// 6</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">returnValue</span><span class="p">;</span>
</span><span class='line'>        <span class="p">};</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">self</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>That&rsquo;s a bit crazy, but here&rsquo;s what&rsquo;s happening:</p>

<ol>
<li><p>First we need the method signature that the selector is going to conform to. We don&rsquo;t <em>actually</em> know it, but we have defined in the API of this class that we expect a selector that takes 1 object argument and returns an <code>NSComparisonResult</code>, just like <code>NSMutableArray</code>&rsquo;s <code>sortUsingSelector:</code> method does. It just so happens that <code>NSNumber</code> has a method that has the same signature, so we use the <code>instanceMethodSignatureForSelector:</code> method to get one. You could have created the signature manually using the ASCII representation of the signature encoding, but this is just easier I think.</p></li>
<li><p>Next we create an invocation object with the signature and set the selector.</p></li>
<li><p>Then comes creating the comparator&hellip;</p></li>
<li><p>When the comparator is invoked, the first thing to do is set the target, argument (which is at index 2 because <code>NSInvocation</code> is wrapping <code>objc_msgSend</code> where the first argument to a method is the 3rd argument to <code>objc_msgSend</code>) and then invoke it.</p></li>
<li><p>To get the return type, we need to create some memory of the right size and the call <code>getReturnValue:</code> to ask the invocation to fill it in with the return value.</p></li>
<li><p>And finally, return the comparison result from the comparator.</p></li>
</ol>


<p>There, that wasn&rsquo;t too bad was it?! That is everything to get the array working!</p>

<h2>Enumerating, quickly</h2>

<p>Anyone using an array will at some point want to enumerate it. That&rsquo;s usually done using <code>NSFastEnumeration</code> which looks something like this:</p>

<pre><code>for (id object in array) {
    // Do something
}
</code></pre>

<p>Now how can we go about adding that to our class then you are asking? Well, <code>NSFastEnumeration</code> all lies with one method:</p>

<pre><code>- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(__unsafe_unretained id [])buffer count:(NSUInteger)len;
</code></pre>

<p><a href="http://www.mikeash.com/pyblog/friday-qa-2010-04-16-implementing-fast-enumeration.html">Mike Ash has a very good post about it</a>, but we don&rsquo;t actually have to do much work. Since there is an <code>NSArray</code> backing this class which already supports fast enumeration, all we have to do is the following:</p>

<figure class='code'><figcaption><span>Implementing fast enumeration</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="n">NSUInteger</span><span class="p">)</span><span class="nf">countByEnumeratingWithState:</span><span class="p">(</span><span class="n">NSFastEnumerationState</span> <span class="o">*</span><span class="p">)</span><span class="nv">state</span> <span class="nf">objects:</span><span class="p">(</span><span class="n">__unsafe_unretained</span> <span class="kt">id</span> <span class="p">[])</span><span class="nv">buffer</span> <span class="nf">count:</span><span class="p">(</span><span class="n">NSUInteger</span><span class="p">)</span><span class="nv">len</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">[</span><span class="n">_backingArray</span> <span class="nl">countByEnumeratingWithState:</span><span class="n">state</span> <span class="nl">objects:</span><span class="n">buffer</span> <span class="nl">count:</span><span class="n">len</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And that&rsquo;s it!</p>

<h2>More more more!</h2>

<p>I implemented a few more methods which you can read the source for on <a href="https://github.com/mattjgalloway/MJGFoundation/blob/master/Source/Model/MJGSortedMutableArray.h">GitHub</a>. Other than that, I will no doubt be adding more to this when I see fit. I also have plans for a dictionary where the keys stay sorted.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Moved to Octopress]]></title>
    <link href="http://www.galloway.me.uk/2012/07/moved-to-octopress/"/>
    <updated>2012-07-21T16:53:00+01:00</updated>
    <id>http://www.galloway.me.uk/2012/07/moved-to-octopress</id>
    <content type="html"><![CDATA[<p>I have been wondering for a while now about what I should do with my iPhone apps blog. It gets a fair amount of hits at around 5,500 uniques per month which I consider to be fairly good considering I don&rsquo;t update it any where near as much as I should. I write for the site when I get a chance and mostly it&rsquo;s just little bits of information I&rsquo;ve picked up along the way when developing apps, and also there&rsquo;s a <a href="http://www.galloway.me.uk/tutorials/custom-uitableviewcell">few</a> <a href="ios-library-with-resources">tutorials</a> which seem to go down well.</p>

<p>But I needed to do something with the site as it was looking very tired and runs on <a href="http://www.wordpress.org">Wordpress</a> so has a dependency on a database when mostly the content is static. Enter <a href="http://www.octopress.org">Octopress</a>.</p>

<!--more-->


<h2>Reasons for switching</h2>

<p>There are a number of reasons why I switched blogging platform. Here they are in no particular order.</p>

<ul>
<li><p>Wordpress => Octopress</p>

<p>  Don&rsquo;t get me wrong, I have nothing again <a href="http://www.php.net">PHP</a> like some <a href="http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/">people seem to</a>, but I realised that I should probably give some other things a try. That&rsquo;s where I found the lovely <a href="http://www.octopress.org">Octopress</a>. It&rsquo;s a blogging framework built on top of <a href="https://github.com/mojombo/jekyll/">Jekyll</a> and all written in Ruby. I get the benefit of trying out Ruby which I have to say is very nice.</p></li>
<li><p>Database backed => Static files</p>

<p>  It&rsquo;s pretty obvious that a website which is just a bunch of static files is going to outperform a database backed one. Also, if your database goes down for any reason or gets overloaded then you&rsquo;re in trouble if it&rsquo;s powering your site also. I now have no dependency on a database so all my database now does is host my DNS records (which to be fair, should also probably be in flat files).</p></li>
<li><p>HTML => Markdown</p>

<p>  Writing my blog meant that I had to use Wordpress&rsquo;s HTML editor or copy and paste into it from outside. This was going OK but I had been using <a href="http://daringfireball.net/projects/markdown/">Markdown</a> for some other things and realised it would be really nice to be able to write my blog using it. Thankfully, Octopress uses it and so I am writing this post in TextWrangler in Markdown and I can say it&rsquo;s <em>much</em> nicer!</p></li>
</ul>


<h2>Where have the comments gone?</h2>

<p>There is only one problem I came across when switching and that is comments. Since this site is now 100% static, I don&rsquo;t have any comments. There are options such as <a href="http://disqus.com/">Disqus</a> but I realised that I simply don&rsquo;t need them. If people want to get in contact with me then the best way is to tweet me or email me.</p>

<h2>The future</h2>

<p>I hope that since it&rsquo;s a lot easier for me to write a blog entry now then I shall do more of it and perhaps some more tutorials as well.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How does objc_retainAutoreleasedReturnValue work?]]></title>
    <link href="http://www.galloway.me.uk/2012/02/how-does-objc_retainautoreleasedreturnvalue-work/"/>
    <updated>2012-02-06T10:55:58+00:00</updated>
    <id>http://www.galloway.me.uk/2012/02/how-does-objc_retainautoreleasedreturnvalue-work</id>
    <content type="html"><![CDATA[<p>Ever since I started doing my &ldquo;A look under ARC&rsquo;s hood&rdquo; <a href="http://iphone.galloway.me.uk/2012/01/a-look-under-arcs-hood-episode-1/">series</a> <a href="http://iphone.galloway.me.uk/2012/01/a-look-under-arcs-hood-episode-2/">of</a> <a href="http://iphone.galloway.me.uk/2012/02/a-look-under-arcs-hood-episode-3/">blog</a> <a href="http://iphone.galloway.me.uk/2012/02/a-look-under-arcs-hood-episode-4/">posts</a> I have been intrigued by <code>objc_retainAutoreleasedReturnValue</code>. It&rsquo;s been covered by <a href="http://www.mikeash.com/pyblog/friday-qa-2011-09-30-automatic-reference-counting.html">Mike Ash on his blog</a> from a conceptual point of view but I haven&rsquo;t found a decent explanation into exactly how it works. So I took a look and here&rsquo;s what I found.</p>

<!--more-->


<h2>What is it meant to do?</h2>

<p>The concept behind <code>objc_retainAutoreleasedReturnValue</code> is that if a value is to be returned from a function autoreleased, but the very next thing that is to be done is a retain on that object then it&rsquo;s absolutely pointless doing the autorelease and retain &ndash; we&rsquo;re just wasting cycles. So if we can somehow determine that we&rsquo;re about to retain then we can save a few CPU cycles. Over the course of a running application this could add up to quite a lot of time and effort saved.</p>

<p>In <a href="http://www.opensource.apple.com/source/objc4/objc4-493.9/runtime/objc-arr.mm">Apple&rsquo;s code</a> they say this:</p>

<blockquote><p>  objc_autoreleaseReturnValue() examines the caller&rsquo;s instructions following
  the return. If the caller&rsquo;s instructions immediately call
  objc_autoreleaseReturnValue, then the callee omits the -autorelease and saves
  the result in thread-local storage. If the caller does not look like it
  cooperates, then the callee calls -autorelease as usual.</p>

<p>  objc_autoreleaseReturnValue checks if the returned value is the same as the
  one in thread-local storage. If it is, the value is used directly. If not,
  the value is assumed to be truly autoreleased and is retained again.  In
  either case, the caller now has a retained reference to the value.</p></blockquote>

<p>I think there is a typo there in that it should read:</p>

<blockquote><p>&ldquo;If the caller&rsquo;s instructions immediately call objc_retainAutoreleasedReturnValue&rdquo;</p></blockquote>

<p>So basically what it means is that if you consider this bit of code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="n">SomeClass</span><span class="o">*</span><span class="p">)</span><span class="nf">createMeAnObject</span> <span class="p">{</span>
</span><span class='line'>   <span class="n">SomeClass</span> <span class="o">*</span><span class="n">obj</span> <span class="o">=</span> <span class="p">[[</span><span class="n">SomeClass</span> <span class="n">alloc</span><span class="p">]</span> <span class="n">init</span><span class="p">];</span>
</span><span class='line'>   <span class="n">obj</span><span class="p">.</span><span class="n">string</span> <span class="o">=</span> <span class="s">@&quot;Badger&quot;</span><span class="p">;</span>
</span><span class='line'>   <span class="n">obj</span><span class="p">.</span><span class="n">number</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
</span><span class='line'>   <span class="k">return</span> <span class="n">obj</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">init</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">((</span><span class="n">self</span> <span class="o">=</span> <span class="p">[</span><span class="n">super</span> <span class="n">init</span><span class="p">]))</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">self</span><span class="p">.</span><span class="n">myObject</span> <span class="o">=</span> <span class="p">[</span><span class="n">self</span> <span class="n">createMeAnObject</span><span class="p">];</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">self</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Just ignore the fact that you wouldn&rsquo;t really do that, but if we rewrite that to include the retains, releases &amp; autoreleases that will be going on behind the scenes then it looks like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="n">SomeClass</span><span class="o">*</span><span class="p">)</span><span class="nf">createMeAnObject</span> <span class="p">{</span>
</span><span class='line'>   <span class="n">SomeClass</span> <span class="o">*</span><span class="n">obj</span> <span class="o">=</span> <span class="p">[[</span><span class="n">SomeClass</span> <span class="n">alloc</span><span class="p">]</span> <span class="n">init</span><span class="p">];</span>
</span><span class='line'>   <span class="n">obj</span><span class="p">.</span><span class="n">string</span> <span class="o">=</span> <span class="s">@&quot;Badger&quot;</span><span class="p">;</span>
</span><span class='line'>   <span class="n">obj</span><span class="p">.</span><span class="n">number</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
</span><span class='line'>   <span class="k">return</span> <span class="p">[</span><span class="n">obj</span> <span class="n">autorelease</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">init</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">((</span><span class="n">self</span> <span class="o">=</span> <span class="p">[</span><span class="n">super</span> <span class="n">init</span><span class="p">]))</span> <span class="p">{</span>
</span><span class='line'>        <span class="p">[</span><span class="n">myObject</span> <span class="n">release</span><span class="p">];</span>
</span><span class='line'>        <span class="n">SomeClass</span> <span class="o">*</span><span class="n">temp</span> <span class="o">=</span> <span class="p">[</span><span class="n">self</span> <span class="n">createMeAnObject</span><span class="p">];</span>
</span><span class='line'>        <span class="n">myObject</span> <span class="o">=</span> <span class="p">[</span><span class="n">temp</span> <span class="n">retain</span><span class="p">];</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">self</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now then if we inline the <code>createMeAnObject</code> code into <code>init</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">init</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">((</span><span class="n">self</span> <span class="o">=</span> <span class="p">[</span><span class="n">super</span> <span class="n">init</span><span class="p">]))</span> <span class="p">{</span>
</span><span class='line'>        <span class="p">[</span><span class="n">myObject</span> <span class="n">release</span><span class="p">];</span>
</span><span class='line'>        <span class="n">SomeClass</span> <span class="o">*</span><span class="n">temp</span> <span class="o">=</span> <span class="p">[[</span><span class="n">SomeClass</span> <span class="n">alloc</span><span class="p">]</span> <span class="n">init</span><span class="p">];</span>
</span><span class='line'>        <span class="n">obj</span><span class="p">.</span><span class="n">string</span> <span class="o">=</span> <span class="s">@&quot;Badger&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="n">obj</span><span class="p">.</span><span class="n">number</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
</span><span class='line'>        <span class="p">[</span><span class="n">temp</span> <span class="n">autorelease</span><span class="p">];</span>
</span><span class='line'>        <span class="n">myObject</span> <span class="o">=</span> <span class="p">[</span><span class="n">temp</span> <span class="n">retain</span><span class="p">];</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">self</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here we notice that there is a <code>[temp autorelease]</code> followed immediately by a <code>[temp retain]</code>. It is this optimisation that the new Objective-C runtime can help us with.</p>

<h2>How does it work &ndash; objc_autoreleaseReturnValue?</h2>

<p>The code is <a href="http://www.opensource.apple.com/source/objc4/objc4-493.9/runtime/objc-arr.mm">out there for the x86 version</a> of this, but there&rsquo;s no ARM code so I had to go digging into the disassembly for it.</p>

<p>Here&rsquo;s the disassembly for <code>objc_autoreleaseReturnValue</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="nl">_objc_autoreleaseReturnValue:</span>
</span><span class='line'><span class="mo">00006</span><span class="n">ec4</span>            <span class="n">b580</span>        <span class="n">push</span>    <span class="p">{</span><span class="n">r7</span><span class="p">,</span> <span class="n">lr</span><span class="p">}</span>
</span><span class='line'><span class="mo">00006</span><span class="n">ec6</span>            <span class="mf">466f</span>        <span class="n">mov</span>     <span class="n">r7</span><span class="p">,</span> <span class="n">sp</span>
</span><span class='line'><span class="mo">00006</span><span class="n">ec8</span>        <span class="n">f01e0f01</span>        <span class="n">tst</span><span class="p">.</span><span class="n">w</span>   <span class="n">lr</span><span class="p">,</span> <span class="err">#</span><span class="mi">1</span>  <span class="err">@</span> <span class="mh">0x1</span>
</span><span class='line'><span class="mo">00006</span><span class="n">ecc</span>            <span class="n">d004</span>        <span class="n">beq</span><span class="p">.</span><span class="n">n</span>   <span class="mh">0x6ed8</span>
</span><span class='line'><span class="mo">00006</span><span class="n">ece</span>        <span class="n">f83e1c01</span>        <span class="n">ldrh</span><span class="p">.</span><span class="n">w</span>  <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">lr</span><span class="p">,</span> <span class="err">#</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
</span><span class='line'><span class="mo">00006</span><span class="n">ed2</span>        <span class="n">f244623f</span>        <span class="n">movw</span>    <span class="n">r2</span><span class="p">,</span> <span class="mh">0x463f</span>
</span><span class='line'><span class="mo">00006</span><span class="n">ed6</span>            <span class="n">e005</span>        <span class="n">b</span><span class="p">.</span><span class="n">n</span>     <span class="mh">0x6ee4</span>
</span><span class='line'><span class="mo">00006</span><span class="n">ed8</span>        <span class="n">f8de1000</span>        <span class="n">ldr</span><span class="p">.</span><span class="n">w</span>   <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">lr</span><span class="p">]</span>
</span><span class='line'><span class="mo">00006</span><span class="n">edc</span>        <span class="n">f2470207</span>        <span class="n">movw</span>    <span class="n">r2</span><span class="p">,</span> <span class="mh">0x7007</span>
</span><span class='line'><span class="mo">00006</span><span class="n">ee0</span>        <span class="n">f2ce12a0</span>        <span class="n">movt</span>    <span class="n">r2</span><span class="p">,</span> <span class="mh">0xe1a0</span>
</span><span class='line'><span class="mo">00006</span><span class="n">ee4</span>            <span class="mi">4291</span>        <span class="n">cmp</span>     <span class="n">r1</span><span class="p">,</span> <span class="n">r2</span>
</span><span class='line'><span class="mo">00006</span><span class="n">ee6</span>            <span class="n">d106</span>        <span class="n">bne</span><span class="p">.</span><span class="n">n</span>   <span class="mh">0x6ef6</span>
</span><span class='line'><span class="mo">00006</span><span class="n">ee8</span>        <span class="n">ee1d1f70</span>        <span class="n">mrc</span>     <span class="mi">15</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">r1</span><span class="p">,</span> <span class="n">cr13</span><span class="p">,</span> <span class="n">cr0</span><span class="p">,</span> <span class="p">{</span><span class="mi">3</span><span class="p">}</span>
</span><span class='line'><span class="mo">00006</span><span class="n">eec</span>        <span class="n">f0210103</span>        <span class="n">bic</span><span class="p">.</span><span class="n">w</span>   <span class="n">r1</span><span class="p">,</span> <span class="n">r1</span><span class="p">,</span> <span class="err">#</span><span class="mi">3</span>      <span class="err">@</span> <span class="mh">0x3</span>
</span><span class='line'><span class="mo">00006</span><span class="n">ef0</span>        <span class="n">f8c100c4</span>        <span class="n">str</span><span class="p">.</span><span class="n">w</span>   <span class="n">r0</span><span class="p">,</span> <span class="p">[</span><span class="n">r1</span><span class="p">,</span> <span class="err">#</span><span class="mi">196</span><span class="p">]</span>
</span><span class='line'><span class="mo">00006</span><span class="n">ef4</span>            <span class="n">bd80</span>        <span class="n">pop</span>     <span class="p">{</span><span class="n">r7</span><span class="p">,</span> <span class="n">pc</span><span class="p">}</span>
</span><span class='line'><span class="mo">00006</span><span class="n">ef6</span>        <span class="n">f00bfb93</span>        <span class="n">bl</span>      <span class="n">_objc_autorelease</span>
</span><span class='line'><span class="mo">00006</span><span class="n">efa</span>            <span class="n">bd80</span>        <span class="n">pop</span>     <span class="p">{</span><span class="n">r7</span><span class="p">,</span> <span class="n">pc</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&rsquo;s break that down then&hellip;</p>

<blockquote><pre><code>00006ec4            b580        push    {r7, lr}
00006ec6            466f        mov     r7, sp
</code></pre></blockquote>

<p>This is a standard prologue for a method in ARM.</p>

<blockquote><pre><code>00006ec8        f01e0f01        tst.w   lr, #1  @ 0x1
00006ecc            d004        beq.n   0x6ed8
</code></pre></blockquote>

<p>Here we are doing the first bit of our sniffing of the following instructions. <code>lr</code> is the &ldquo;link register&rdquo; and contains the address of the method that we&rsquo;re returning to. Since this method is always called as a <a href="http://en.wikipedia.org/wiki/Tail_call">tail call</a>, this will contain the address of the caller of our method that&rsquo;s returning a value autoreleased.</p>

<p>The <code>tst</code> instruction is doing a bitwise AND of the value in <code>lr</code> and the integer value 1. Then the <code>beq</code> will branch if the zero flag is set, i.e. if <code>lr &amp; 1 == 0</code>. So this means that we are testing if the lowest bit is <em>not</em> set. You can either read up about ARM processors or take it from me that if the low bit is set on the link register then it means the caller is in thumb mode. So this means that if we&rsquo;re going back to ARM code then we branch over a few instructions to <code>0x6ed8</code> whereas if we&rsquo;re going back to Thumb code then we don&rsquo;t branch.</p>

<blockquote><pre><code>00006ece        f83e1c01        ldrh.w  r1, [lr, #-1]
00006ed2        f244623f        movw    r2, 0x463f
00006ed6            e005        b.n     0x6ee4
</code></pre></blockquote>

<p>This is the case that gets run if our condition before was not true. We are loading a half word (16-bits) from <code>lr - 1</code> into <code>r1</code> (we need the -1 because of the reason from before that the low bit is set if we&rsquo;re in Thumb mode so actually the next instruction after return will be at <code>lr - 1</code>). We then put <code>0x463f</code> into <code>r2</code>. Then we jump to <code>0x6ee4</code>.</p>

<blockquote><pre><code>00006ed8        f8de1000        ldr.w   r1, [lr]
00006edc        f2470207        movw    r2, 0x7007
00006ee0        f2ce12a0        movt    r2, 0xe1a0
</code></pre></blockquote>

<p>This is the case that gets run if our condition before was true. We are here loading a whole 32-bits from <code>lr</code> into <code>r1</code> and loading <code>0xe1a07007</code> into <code>r2</code>.</p>

<blockquote><pre><code>00006ee4            4291        cmp     r1, r2
00006ee6            d106        bne.n   0x6ef6
</code></pre></blockquote>

<p>The next section compares the two registers that we&rsquo;ve just been setting in one of two ways. If they are not equal then we branch over to <code>0x6ef6</code></p>

<p>So we&rsquo;re matching against either <code>0x463f</code> (if it&rsquo;s Thumb mode) or <code>0xe1a07007</code> (if it&rsquo;s ARM mode). Why do we care that the instructions that we&rsquo;re about to run when we return have those particular binary values? Well if we compile a method that does the <code>objc_autoreleaseReturnValue</code> and <code>objc_retainAutoreleasedReturnValue</code> dance then we see that the compiler adds in an instruction which acts as a marker. Let&rsquo;s see what it looks like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="n">Thumb</span> <span class="n">mode</span><span class="o">:</span>
</span><span class='line'><span class="n">f7ffef56</span>   <span class="n">blx</span>  <span class="n">_objc_msgSend</span>
</span><span class='line'>    <span class="mf">463f</span>  <span class="n">mov</span>  <span class="n">r7</span><span class="p">,</span> <span class="n">r7</span>
</span><span class='line'><span class="n">f7ffef54</span>   <span class="n">blx</span>  <span class="n">_objc_retainAutoreleasedReturnValue</span>
</span><span class='line'>
</span><span class='line'><span class="n">ARM</span> <span class="n">mode</span><span class="o">:</span>
</span><span class='line'><span class="n">ebffffa0</span>   <span class="n">bl</span>   <span class="n">_objc_msgSend</span>
</span><span class='line'><span class="n">e1a07007</span>   <span class="n">mov</span>  <span class="n">r7</span><span class="p">,</span> <span class="n">r7</span>
</span><span class='line'><span class="n">ebffff9e</span>   <span class="n">bl</span>   <span class="n">_objc_retainAutoreleasedReturnValue</span>
</span></code></pre></td></tr></table></div></figure>


<p>Well take a look at that. It&rsquo;s added in a <code>mov r7, r7</code> in each case which is a noop (i.e. does nothing as it moves <code>r7</code> back into itself). If you examine the binary values for these instructions then you&rsquo;ll see they match the values that we were told to compare against. The compiler has added this as a marker to tell the <code>objc_autoreleaseReturnValue</code> that the caller is about to call <code>objc_retainAutoreleasedReturnValue</code>.</p>

<blockquote><pre><code>00006ee8        ee1d1f70        mrc     15, 0, r1, cr13, cr0, {3}
00006eec        f0210103        bic.w   r1, r1, #3      @ 0x3
00006ef0        f8c100c4        str.w   r0, [r1, #196]
00006ef4            bd80        pop     {r7, pc}
</code></pre></blockquote>

<p>This is the code that gets run if the instructions matched. It appears to be getting a value from a coprocessor (the <code>mrc</code> instruction) then acting on it and storing <code>r0</code> (which will be the value that&rsquo;s to be returned) into the memory location computed. Then it returns. I&rsquo;m not entirely sure what this coprocessor magic is doing but it will probably become apparent when we look at the code for <code>objc_retainAutoreleasedReturnValue</code>. But essentially it&rsquo;s setting some flag that we&rsquo;ll read later.</p>

<blockquote><pre><code>00006ef6        f00bfb93        bl      _objc_autorelease
00006efa            bd80        pop     {r7, pc}
</code></pre></blockquote>

<p>Finally, this is where we get to if the instructions did not match. This performs a normal call to <code>objc_autorelease</code> incase the caller is not about to retain the object.</p>

<h2>How does it work &ndash; objc_retainAutoreleasedReturnValue?</h2>

<p>Let&rsquo;s now take a look at <code>objc_retainAutoreleasedReturnValue</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="nl">_objc_retainAutoreleasedReturnValue:</span>
</span><span class='line'><span class="mo">00012</span><span class="n">bbc</span>            <span class="n">b580</span>        <span class="n">push</span>    <span class="p">{</span><span class="n">r7</span><span class="p">,</span> <span class="n">lr</span><span class="p">}</span>
</span><span class='line'><span class="mo">00012</span><span class="n">bbe</span>        <span class="n">ee1d1f70</span>        <span class="n">mrc</span>     <span class="mi">15</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">r1</span><span class="p">,</span> <span class="n">cr13</span><span class="p">,</span> <span class="n">cr0</span><span class="p">,</span> <span class="p">{</span><span class="mi">3</span><span class="p">}</span>
</span><span class='line'><span class="mo">00012</span><span class="n">bc2</span>            <span class="mf">466f</span>        <span class="n">mov</span>     <span class="n">r7</span><span class="p">,</span> <span class="n">sp</span>
</span><span class='line'><span class="mo">00012</span><span class="n">bc4</span>        <span class="n">f0210103</span>        <span class="n">bic</span><span class="p">.</span><span class="n">w</span>   <span class="n">r1</span><span class="p">,</span> <span class="n">r1</span><span class="p">,</span> <span class="err">#</span><span class="mi">3</span>      <span class="err">@</span> <span class="mh">0x3</span>
</span><span class='line'><span class="mo">00012</span><span class="n">bc8</span>        <span class="n">f8d110c4</span>        <span class="n">ldr</span><span class="p">.</span><span class="n">w</span>   <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">r1</span><span class="p">,</span> <span class="err">#</span><span class="mi">196</span><span class="p">]</span>
</span><span class='line'><span class="mo">00012</span><span class="n">bcc</span>            <span class="mi">4281</span>        <span class="n">cmp</span>     <span class="n">r1</span><span class="p">,</span> <span class="n">r0</span>
</span><span class='line'><span class="mo">00012</span><span class="n">bce</span>            <span class="n">d107</span>        <span class="n">bne</span><span class="p">.</span><span class="n">n</span>   <span class="mh">0x12be0</span>
</span><span class='line'><span class="mo">00012</span><span class="n">bd0</span>        <span class="n">ee1d1f70</span>        <span class="n">mrc</span>     <span class="mi">15</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">r1</span><span class="p">,</span> <span class="n">cr13</span><span class="p">,</span> <span class="n">cr0</span><span class="p">,</span> <span class="p">{</span><span class="mi">3</span><span class="p">}</span>
</span><span class='line'><span class="mo">00012</span><span class="n">bd4</span>            <span class="mi">2200</span>        <span class="n">movs</span>    <span class="n">r2</span><span class="p">,</span> <span class="err">#</span><span class="mi">0</span>
</span><span class='line'><span class="mo">00012</span><span class="n">bd6</span>        <span class="n">f0210103</span>        <span class="n">bic</span><span class="p">.</span><span class="n">w</span>   <span class="n">r1</span><span class="p">,</span> <span class="n">r1</span><span class="p">,</span> <span class="err">#</span><span class="mi">3</span>      <span class="err">@</span> <span class="mh">0x3</span>
</span><span class='line'><span class="mo">00012</span><span class="n">bda</span>        <span class="n">f8c120c4</span>        <span class="n">str</span><span class="p">.</span><span class="n">w</span>   <span class="n">r2</span><span class="p">,</span> <span class="p">[</span><span class="n">r1</span><span class="p">,</span> <span class="err">#</span><span class="mi">196</span><span class="p">]</span>
</span><span class='line'><span class="mo">00012</span><span class="n">bde</span>            <span class="n">bd80</span>        <span class="n">pop</span>     <span class="p">{</span><span class="n">r7</span><span class="p">,</span> <span class="n">pc</span><span class="p">}</span>
</span><span class='line'><span class="mo">00012</span><span class="n">be0</span>        <span class="n">f7f3f976</span>        <span class="n">bl</span>      <span class="n">_objc_retain</span>
</span><span class='line'><span class="mo">00012</span><span class="n">be4</span>            <span class="n">bd80</span>        <span class="n">pop</span>     <span class="p">{</span><span class="n">r7</span><span class="p">,</span> <span class="n">pc</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And again, breaking that down we get:</p>

<blockquote><pre><code>00012bbc            b580        push    {r7, lr}
</code></pre></blockquote>

<p>Standard prologue for a method.</p>

<blockquote><pre><code>00012bbe        ee1d1f70        mrc     15, 0, r1, cr13, cr0, {3}
00012bc2            466f        mov     r7, sp
00012bc4        f0210103        bic.w   r1, r1, #3      @ 0x3
00012bc8        f8d110c4        ldr.w   r1, [r1, #196]
</code></pre></blockquote>

<p>Here we get some more context on what that <code>mrc</code> was all about before. We can see here that we&rsquo;re running the same instruction as we did before and doing the same <code>bic</code> instruction and then loading value stored at the computed address into <code>r1</code>.</p>

<blockquote><pre><code>00012bcc            4281        cmp     r1, r0
00012bce            d107        bne.n   0x12be0
</code></pre></blockquote>

<p>Now this is the interesting bit. We&rsquo;re checking that the value we obtained from doing the dance with the coprocessor (<code>r1</code>) is the same as the object passed into this method (<code>r0</code>). If these two match then we know that the object we are trying to retain has just been returned from a method that had called <code>objc_autoreleaseReturnValue</code>. So we don&rsquo;t need to do anything. It&rsquo;s not been autoreleased so we&rsquo;re not going to retain it.</p>

<blockquote><pre><code>00012bd0        ee1d1f70        mrc     15, 0, r1, cr13, cr0, {3}
00012bd4            2200        movs    r2, #0
00012bd6        f0210103        bic.w   r1, r1, #3      @ 0x3
00012bda        f8c120c4        str.w   r2, [r1, #196]
00012bde            bd80        pop     {r7, pc}
</code></pre></blockquote>

<p>This is the code that then gets run if the comparison was true &ndash; i.e. this object had just gone through a <code>objc_autoreleaseReturnValue</code>. We clear out the value in the coprocessor magic dance and return.</p>

<blockquote><pre><code>00012be0        f7f3f976        bl      _objc_retain
00012be4            bd80        pop     {r7, pc}
</code></pre></blockquote>

<p>If it didn&rsquo;t match, then we know that this object has not gone through a <code>objc_autoreleaseReturnValue</code>, which is likely because the method we called was not compiled with ARC enabled. So we do a retain.</p>

<h2>Phew, so explain that again please?</h2>

<p>It&rsquo;s probably easiest to consider the following pseudo code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="n">id</span> <span class="nf">objc_autoreleaseReturnValue</span><span class="p">(</span><span class="n">id</span> <span class="n">object</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">thumb_mode</span> <span class="o">&amp;&amp;</span> <span class="n">next_instruction_after_return</span> <span class="o">==</span> <span class="mh">0x463f</span> <span class="o">||</span>
</span><span class='line'>        <span class="n">arm_mode</span>   <span class="o">&amp;&amp;</span> <span class="n">next_instruction_after_return</span> <span class="o">==</span> <span class="mh">0xe1a07007</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">set_flag</span><span class="p">(</span><span class="n">object</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">objc_autorelease</span><span class="p">(</span><span class="n">object</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">id</span> <span class="nf">objc_retainAutoreleasedReturnValue</span><span class="p">(</span><span class="n">id</span> <span class="n">object</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">get_flag</span><span class="p">(</span><span class="n">object</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">clear_flag</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">objc_retain</span><span class="p">(</span><span class="n">object</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>That is basically what it all boils down to and with some tail call optimisations this can all be incredibly optimised compared to all the redundant autorelease followed by retain pairs that we must have had in code before ARC was invented.</p>

<h2>Conclusions</h2>

<p>This is yet again some awesome stuff from the Apple engineers here. Sniffing the next instructions to be executed is some very clever stuff to ensure that it&rsquo;s always going to work. They must have to ensure that the marker (<code>mov r7, r7</code>) isn&rsquo;t moved by the optimiser for instance and I&rsquo;m sure lots of edge cases but it seems to work a treat!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A look under ARC's hood - Episode 4]]></title>
    <link href="http://www.galloway.me.uk/2012/02/a-look-under-arcs-hood-episode-4/"/>
    <updated>2012-02-05T13:33:46+00:00</updated>
    <id>http://www.galloway.me.uk/2012/02/a-look-under-arcs-hood-episode-4</id>
    <content type="html"><![CDATA[<p>The next episode of my deep clambering into the underbelly of ARC starts from <a href="http://twitter.com/#!/steipete/status/165159717814013953">this Tweet by @steipete</a> where he says &ldquo;With ARC, I now find myself typing &#8220;new&rdquo; for dumb model objects. Yay or Nay?&ldquo;. It got me thinking. He&rsquo;s totally right that with ARC we can now just use <code>[SomeClass new]</code> and let ARC handle all the memory management for us. Previously we&rsquo;d often create a convenience class method on <code>SomeClass</code> which would return an object autoreleased so that it made the calling code clean and easy to understand the memory management. Now with ARC we don&rsquo;t need to do that and I wondered what would be the benefit of using <code>new</code> over <code>alloc + init</code> over using our old friends, the convenience class methods. This blog post tells that story.</p>

<!--more-->


<h2>Some background on new</h2>

<p>First we&rsquo;ll take a look at what <code>new</code> actually does. <a href="https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/clm/NSObject/new">According to the Apple documentation</a>, it does this:</p>

<blockquote><p>Allocates a new instance of the receiving class, sends it an init message, and returns the initialized object.</p></blockquote>

<p>So we should expect a call like <code>[SomeClass new]</code> to be equivalent to <code>[[SomeClass alloc] init]</code>. The memory management here tells us that the returned object is owned by the caller, i.e. it&rsquo;s returned with a +1 retain count. In the days of pre-ARC, we would therefore have to release this object when we were done with it. ARC adds these in for us as we know.</p>

<h2>What&rsquo;s being tested</h2>

<p>What I wanted to know is which is faster out of these methods:</p>

<ol>
<li> <code>[[SomeClass alloc] init]</code></li>
<li> <code>[SomeClass new]</code></li>
<li> <code>[SomeClass giveMeAnObject]</code></li>
<li> <code>[SomeClass newObject]</code></li>
</ol>


<p>Where <code>giveMeAnObject</code> is a convenience method to return an object autoreleased and <code>newObject</code> is a convenience method which we would hope is the same as the standard <code>new</code>.</p>

<h2>How to test</h2>

<p>In order to benchmark each of these methods I decided to time how long it would take to call each of them a given number of times with correct memory management (well, I have no choice if ARC is enabled). I used this method for timing which gives me the number of nanoseconds that my code took to execute:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">uint64_t</span> <span class="n">start</span> <span class="o">=</span> <span class="n">mach_absolute_time</span><span class="p">();</span>
</span><span class='line'><span class="c1">// Do something which takes a while        </span>
</span><span class='line'><span class="n">uint64_t</span> <span class="n">end</span> <span class="o">=</span> <span class="n">mach_absolute_time</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="n">mach_timebase_info_data_t</span> <span class="n">timebaseInfo</span><span class="p">;</span>
</span><span class='line'><span class="n">mach_timebase_info</span><span class="p">(</span><span class="o">&amp;</span><span class="n">timebaseInfo</span><span class="p">);</span>
</span><span class='line'><span class="n">uint64_t</span> <span class="n">timeNanos</span> <span class="o">=</span> <span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">start</span><span class="p">)</span> <span class="o">*</span> <span class="n">timebaseInfo</span><span class="p">.</span><span class="n">numer</span> <span class="o">/</span> <span class="n">timebaseInfo</span><span class="p">.</span><span class="n">denom</span><span class="p">;</span>
</span><span class='line'><span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;time = %&quot;</span><span class="n">PRIu64</span><span class="p">,</span> <span class="n">timeNanos</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>In order to test this and to ensure there&rsquo;d be no shortcuts made by the compiler / runtime by using an <code>NSString</code> or an <code>NSNumber</code> I created a simple dummy class called <code>ClassA</code> like so:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">@interface</span> <span class="nc">ClassA</span> : <span class="nc">NSObject</span>
</span><span class='line'><span class="k">+</span> <span class="p">(</span><span class="n">ClassA</span><span class="o">*</span><span class="p">)</span><span class="nf">giveMeAnObject</span><span class="p">;</span>
</span><span class='line'><span class="k">+</span> <span class="p">(</span><span class="n">ClassA</span><span class="o">*</span><span class="p">)</span><span class="nf">newObject</span><span class="p">;</span>
</span><span class='line'><span class="k">@end</span>
</span><span class='line'>
</span><span class='line'><span class="k">@implementation</span> <span class="nc">ClassA</span>
</span><span class='line'><span class="k">+</span> <span class="p">(</span><span class="n">ClassA</span><span class="o">*</span><span class="p">)</span><span class="nf">giveMeAnObject</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">[[</span><span class="n">ClassA</span> <span class="n">alloc</span><span class="p">]</span> <span class="n">init</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="k">+</span> <span class="p">(</span><span class="n">ClassA</span><span class="o">*</span><span class="p">)</span><span class="nf">newObject</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">[[</span><span class="n">ClassA</span> <span class="n">alloc</span><span class="p">]</span> <span class="n">init</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="k">@end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then to benchmark each one I decided to loop for a number of iterations ranging from 1000 to 10000000 for each style of creating an instance of <code>ClassA</code>. Each of these should have the exact same effect, but we&rsquo;d like to know how they differ in speed. Below is the code I used, commenting out all but one of the <code>ClassA *x =</code> each time I did the test.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">iterations</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">ClassA</span> <span class="o">*</span><span class="n">a</span> <span class="o">=</span> <span class="p">[[</span><span class="n">ClassA</span> <span class="n">alloc</span><span class="p">]</span> <span class="n">init</span><span class="p">];</span>
</span><span class='line'>    <span class="n">ClassA</span> <span class="o">*</span><span class="n">b</span> <span class="o">=</span> <span class="p">[</span><span class="n">ClassA</span> <span class="n">new</span><span class="p">];</span>
</span><span class='line'>    <span class="n">ClassA</span> <span class="o">*</span><span class="n">c</span> <span class="o">=</span> <span class="p">[</span><span class="n">ClassA</span> <span class="n">giveMeAnObject</span><span class="p">];</span>
</span><span class='line'>    <span class="n">ClassA</span> <span class="o">*</span><span class="n">d</span> <span class="o">=</span> <span class="p">[</span><span class="n">ClassA</span> <span class="n">newObject</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>For each of these tests I used my iPhone 4 (so ARMv7), running iOS 5.0.1 and compiled the code at <code>O3</code>.</p>

<h2>The results are in!</h2>

<p>Below are the results of running the tests. The value under each column is the time taken in milliseconds for the number of iterations given on the left.</p>

<table>
<thead>
<tr>
<th align="center">   </th>
<th align="center">  <strong>A</strong>  </th>
<th align="center">  <strong>B</strong>  </th>
<th align="center">  <strong>C</strong>  </th>
<th align="center">  <strong>D</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center"><strong>1000</strong> </td>
<td align="center"> 2.264 </td>
<td align="center"> 2.349 </td>
<td align="center"> 2.199 </td>
<td align="center"> 2.394</td>
</tr>
<tr>
<td align="center"><strong>5000</strong> </td>
<td align="center"> 10.102 </td>
<td align="center"> 10.149 </td>
<td align="center"> 9.993 </td>
<td align="center"> 11.017</td>
</tr>
<tr>
<td align="center"><strong>10000</strong> </td>
<td align="center"> 19.180 </td>
<td align="center"> 20.148 </td>
<td align="center"> 19.509 </td>
<td align="center"> 20.036</td>
</tr>
<tr>
<td align="center"><strong>50000</strong> </td>
<td align="center"> 92.357 </td>
<td align="center"> 98.177 </td>
<td align="center"> 104.362 </td>
<td align="center"> 97.099</td>
</tr>
<tr>
<td align="center"><strong>100000</strong> </td>
<td align="center"> 185.054 </td>
<td align="center"> 199.825 </td>
<td align="center"> 204.560 </td>
<td align="center"> 194.353</td>
</tr>
<tr>
<td align="center"><strong>500000</strong> </td>
<td align="center"> 924.090 </td>
<td align="center"> 1000.588 </td>
<td align="center"> 1335.106 </td>
<td align="center"> 985.735</td>
</tr>
<tr>
<td align="center"><strong>1000000</strong> </td>
<td align="center"> 1863.110 </td>
<td align="center"> 1973.086 </td>
<td align="center"> 2885.719 </td>
<td align="center"> 1977.487</td>
</tr>
<tr>
<td align="center"><strong>5000000</strong> </td>
<td align="center"> 9407.941 </td>
<td align="center"> 10245.857 </td>
<td align="center"> 23314.495 </td>
<td align="center"> 9757.074</td>
</tr>
<tr>
<td align="center"><strong>10000000</strong> </td>
<td align="center"> 18557.632 </td>
<td align="center"> 20841.905 </td>
<td align="center"> 56602.491 </td>
<td align="center"> 20315.784</td>
</tr>
</tbody>
</table>


<p>And graphically, that looks like this:</p>

<p><img src="http://www.galloway.me.uk/media/images/2012-02-05-a-look-under-arcs-hood-episode-4/ARC-Episode4-graph-1024x560.png" alt="Results" /></p>

<p>So what does that tell us then? Well it basically tells us that <code>alloc + init</code> is fastest, with <code>new</code> and our custom convenience <code>new</code> close behind. It also shows us that for large iterations, our convenience method that returns the value autoreleased is quite a bit slower. At the maximum number of iterations, it was more than twice as slow as the other methods.</p>

<h2>Let&rsquo;s analyse what happened then</h2>

<p>In order to understand what&rsquo;s going on here, let&rsquo;s take a look at the code generated. Below are the various interesting bits of code.</p>

<figure class='code'><figcaption><span>ClassA&#8217;s giveMeAnObject (18 instructions)</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="p">.</span><span class="n">align</span>    <span class="mi">2</span>
</span><span class='line'><span class="p">.</span><span class="n">code</span>   <span class="mi">16</span>
</span><span class='line'><span class="p">.</span><span class="n">thumb_func</span> <span class="s">&quot;+[ClassA giveMeAnObject]&quot;</span>
</span><span class='line'><span class="s">&quot;+[ClassA giveMeAnObject]&quot;</span><span class="o">:</span>
</span><span class='line'>    <span class="n">push</span>    <span class="p">{</span><span class="n">r7</span><span class="p">,</span> <span class="n">lr</span><span class="p">}</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_SELECTOR_REFERENCES_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC0_0</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r7</span><span class="p">,</span> <span class="n">sp</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_SELECTOR_REFERENCES_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC0_0</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_CLASSLIST_REFERENCES_</span><span class="err">$</span><span class="n">_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC0_1</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_CLASSLIST_REFERENCES_</span><span class="err">$</span><span class="n">_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC0_1</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC0_0:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r1</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'><span class="nl">LPC0_1:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">r1</span><span class="p">]</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r0</span><span class="p">,</span> <span class="p">[</span><span class="n">r0</span><span class="p">]</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_msgSend</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_SELECTOR_REFERENCES_2</span><span class="o">-</span><span class="p">(</span><span class="n">LPC0_2</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_SELECTOR_REFERENCES_2</span><span class="o">-</span><span class="p">(</span><span class="n">LPC0_2</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC0_2:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r1</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">r1</span><span class="p">]</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_msgSend</span>
</span><span class='line'>    <span class="n">pop</span><span class="p">.</span><span class="n">w</span>   <span class="p">{</span><span class="n">r7</span><span class="p">,</span> <span class="n">lr</span><span class="p">}</span>
</span><span class='line'>    <span class="n">b</span><span class="p">.</span><span class="n">w</span>     <span class="n">_objc_autorelease</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>ClassA`&#8217;s `newObject (17 instructions)</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="p">.</span><span class="n">align</span>    <span class="mi">2</span>
</span><span class='line'><span class="p">.</span><span class="n">code</span>   <span class="mi">16</span>
</span><span class='line'><span class="p">.</span><span class="n">thumb_func</span> <span class="s">&quot;+[ClassA newObject]&quot;</span>
</span><span class='line'><span class="s">&quot;+[ClassA newObject]&quot;</span><span class="o">:</span>
</span><span class='line'>    <span class="n">push</span>    <span class="p">{</span><span class="n">r7</span><span class="p">,</span> <span class="n">lr</span><span class="p">}</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_SELECTOR_REFERENCES_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC4_0</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r7</span><span class="p">,</span> <span class="n">sp</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_SELECTOR_REFERENCES_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC4_0</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_CLASSLIST_REFERENCES_</span><span class="err">$</span><span class="n">_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC4_1</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_CLASSLIST_REFERENCES_</span><span class="err">$</span><span class="n">_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC4_1</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC4_0:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r1</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'><span class="nl">LPC4_1:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">r1</span><span class="p">]</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r0</span><span class="p">,</span> <span class="p">[</span><span class="n">r0</span><span class="p">]</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_msgSend</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_SELECTOR_REFERENCES_2</span><span class="o">-</span><span class="p">(</span><span class="n">LPC4_2</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_SELECTOR_REFERENCES_2</span><span class="o">-</span><span class="p">(</span><span class="n">LPC4_2</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC4_2:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r1</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">r1</span><span class="p">]</span>
</span><span class='line'>    <span class="n">pop</span><span class="p">.</span><span class="n">w</span>   <span class="p">{</span><span class="n">r7</span><span class="p">,</span> <span class="n">lr</span><span class="p">}</span>
</span><span class='line'>    <span class="n">b</span><span class="p">.</span><span class="n">w</span>     <span class="n">_objc_msgSend</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Iteration loop for method A (11 instructions)</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="nl">LBB2_1:</span>
</span><span class='line'>  <span class="n">ldr</span>  <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">r5</span><span class="p">]</span>
</span><span class='line'>  <span class="n">ldr</span>  <span class="n">r0</span><span class="p">,</span> <span class="p">[</span><span class="n">r6</span><span class="p">]</span>
</span><span class='line'>  <span class="n">blx</span>  <span class="n">_objc_msgSend</span>
</span><span class='line'>  <span class="n">ldr</span><span class="p">.</span><span class="n">w</span>  <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">r8</span><span class="p">]</span>
</span><span class='line'>  <span class="n">blx</span>  <span class="n">_objc_msgSend</span>
</span><span class='line'>  <span class="n">blx</span>  <span class="n">_objc_release</span>
</span><span class='line'>  <span class="n">adds</span><span class="p">.</span><span class="n">w</span> <span class="n">r11</span><span class="p">,</span> <span class="n">r11</span><span class="p">,</span> <span class="err">#</span><span class="mi">1</span>
</span><span class='line'>  <span class="n">eor</span><span class="p">.</span><span class="n">w</span>  <span class="n">r0</span><span class="p">,</span> <span class="n">r11</span><span class="p">,</span> <span class="n">r10</span>
</span><span class='line'>  <span class="n">adc</span>  <span class="n">r4</span><span class="p">,</span> <span class="n">r4</span><span class="p">,</span> <span class="err">#</span><span class="mi">0</span>
</span><span class='line'>  <span class="n">orrs</span> <span class="n">r0</span><span class="p">,</span> <span class="n">r4</span>
</span><span class='line'>  <span class="n">bne</span>  <span class="n">LBB2_1</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Iteration loop for method B (9 instructions)</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="nl">LBB2_1:</span>
</span><span class='line'>  <span class="n">ldr</span>  <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">r5</span><span class="p">]</span>
</span><span class='line'>  <span class="n">ldr</span>  <span class="n">r0</span><span class="p">,</span> <span class="p">[</span><span class="n">r6</span><span class="p">]</span>
</span><span class='line'>  <span class="n">blx</span>  <span class="n">_objc_msgSend</span>
</span><span class='line'>  <span class="n">blx</span>  <span class="n">_objc_release</span>
</span><span class='line'>  <span class="n">adds</span><span class="p">.</span><span class="n">w</span> <span class="n">r10</span><span class="p">,</span> <span class="n">r10</span><span class="p">,</span> <span class="err">#</span><span class="mi">1</span>
</span><span class='line'>  <span class="n">eor</span><span class="p">.</span><span class="n">w</span>  <span class="n">r0</span><span class="p">,</span> <span class="n">r10</span><span class="p">,</span> <span class="n">r8</span>
</span><span class='line'>  <span class="n">adc</span>  <span class="n">r4</span><span class="p">,</span> <span class="n">r4</span><span class="p">,</span> <span class="err">#</span><span class="mi">0</span>
</span><span class='line'>  <span class="n">orrs</span> <span class="n">r0</span><span class="p">,</span> <span class="n">r4</span>
</span><span class='line'>  <span class="n">bne</span>  <span class="n">LBB2_1</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Iteration loop for method C (11 instructions)</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="nl">LBB2_1:</span>
</span><span class='line'>  <span class="n">ldr</span>  <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">r5</span><span class="p">]</span>
</span><span class='line'>  <span class="n">ldr</span>  <span class="n">r0</span><span class="p">,</span> <span class="p">[</span><span class="n">r6</span><span class="p">]</span>
</span><span class='line'>  <span class="n">blx</span>  <span class="n">_objc_msgSend</span>
</span><span class='line'>  <span class="err">@</span> <span class="n">InlineAsm</span> <span class="n">Start</span>
</span><span class='line'>  <span class="n">mov</span>  <span class="n">r7</span><span class="p">,</span> <span class="n">r7</span>     <span class="err">@</span> <span class="n">marker</span> <span class="k">for</span> <span class="n">objc_retainAutoreleaseReturnValue</span>
</span><span class='line'>  <span class="err">@</span> <span class="n">InlineAsm</span> <span class="n">End</span>
</span><span class='line'>  <span class="n">blx</span>  <span class="n">_objc_retainAutoreleasedReturnValue</span>
</span><span class='line'>  <span class="n">blx</span>  <span class="n">_objc_release</span>
</span><span class='line'>  <span class="n">adds</span><span class="p">.</span><span class="n">w</span> <span class="n">r10</span><span class="p">,</span> <span class="n">r10</span><span class="p">,</span> <span class="err">#</span><span class="mi">1</span>
</span><span class='line'>  <span class="n">eor</span><span class="p">.</span><span class="n">w</span>  <span class="n">r0</span><span class="p">,</span> <span class="n">r10</span><span class="p">,</span> <span class="n">r8</span>
</span><span class='line'>  <span class="n">adc</span>  <span class="n">r4</span><span class="p">,</span> <span class="n">r4</span><span class="p">,</span> <span class="err">#</span><span class="mi">0</span>
</span><span class='line'>  <span class="n">orrs</span> <span class="n">r0</span><span class="p">,</span> <span class="n">r4</span>
</span><span class='line'>  <span class="n">bne</span>  <span class="n">LBB2_1</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Iteration loop for method D (9 instructions)</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="nl">LBB2_1:</span>
</span><span class='line'>  <span class="n">ldr</span>  <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">r5</span><span class="p">]</span>
</span><span class='line'>  <span class="n">ldr</span>  <span class="n">r0</span><span class="p">,</span> <span class="p">[</span><span class="n">r6</span><span class="p">]</span>
</span><span class='line'>  <span class="n">blx</span>  <span class="n">_objc_msgSend</span>
</span><span class='line'>  <span class="n">blx</span>  <span class="n">_objc_release</span>
</span><span class='line'>  <span class="n">adds</span><span class="p">.</span><span class="n">w</span> <span class="n">r10</span><span class="p">,</span> <span class="n">r10</span><span class="p">,</span> <span class="err">#</span><span class="mi">1</span>
</span><span class='line'>  <span class="n">eor</span><span class="p">.</span><span class="n">w</span>  <span class="n">r0</span><span class="p">,</span> <span class="n">r10</span><span class="p">,</span> <span class="n">r8</span>
</span><span class='line'>  <span class="n">adc</span>  <span class="n">r4</span><span class="p">,</span> <span class="n">r4</span><span class="p">,</span> <span class="err">#</span><span class="mi">0</span>
</span><span class='line'>  <span class="n">orrs</span> <span class="n">r0</span><span class="p">,</span> <span class="n">r4</span>
</span><span class='line'>  <span class="n">bne</span>  <span class="n">LBB2_1</span>
</span></code></pre></td></tr></table></div></figure>


<p>So having looked at all the relevant code it might be surprising that these are that different. They&rsquo;re all going to have a similar number of instructions. Infact method A has in the inner loop more instructions, but it was the fastest. The interesting question is why is method C so much slower than the others for large number of iterations? If we take a look at the generated code for method C we&rsquo;ll notice that there&rsquo;s a call to <code>objc_retainAutoreleasedReturnValue</code>. This method is a kind of shortcut to retain a value that will have been returned autoreleased. It should be working with our code since all of this is compiled using ARC and running on an iOS 5 device. It was interesting to me then that this method took twice as long at large numbers of iterations. I can understand that it&rsquo;s likely to be slower since there&rsquo;s more message dispatch going on, but I did not expect it to be that much slower and also interesting that the difference increase with increasing number of iterations.</p>

<h2>Conclusions</h2>

<p><del>I’m actually at a loss as to how to explain why method C is so much slower</del>. It&rsquo;s great to see that A, B and D are roughly the same speed, which is of course what we would expect. <del>This whole thing does mean that we are much better off using <code>new</code>, <code>alloc + init</code> or a convenience method that returns an object with a +1 retain count rather than using convenience methods that return the object autoreleased.</del> See below for a reasoning for why method C was slower and how method C can become just as fast as the other methods.</p>

<h2>Ah ha! That&rsquo;s why!</h2>

<p>Having done a bit more digging I have found why method C was so much slower. Whilst I was writing this up I thought it was a bit odd that the tail call in <code>giveMeAnObject</code> was to <code>objc_autorelease</code> rather than <code>objc_autoreleaseReturnValue</code>. The magic of <code>objc_retainAutoreleasedReturnValue</code> which I refer to previously only works if the value has been returned with <code>objc_autoreleaseReturnValue</code>. The internals of that are for a later blog post but just take it from me that it works like that. So I decided to just change the return type of <code>giveMeAnObject</code> from <code>ClassA*</code> to <code>id</code>. I thought that this should make absolutely no difference. I was wrong. Take a look and see:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">+</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="nf">giveMeAnObject</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">[[</span><span class="n">ClassA</span> <span class="n">alloc</span><span class="p">]</span> <span class="n">init</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Assembly for giveMeAnObject</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'>    <span class="p">.</span><span class="n">align</span>  <span class="mi">2</span>
</span><span class='line'>    <span class="p">.</span><span class="n">code</span>   <span class="mi">16</span>
</span><span class='line'>    <span class="p">.</span><span class="n">thumb_func</span>     <span class="s">&quot;+[ClassA giveMeAnObject3]&quot;</span>
</span><span class='line'><span class="s">&quot;+[ClassA giveMeAnObject3]&quot;</span><span class="o">:</span>
</span><span class='line'>    <span class="n">push</span>    <span class="p">{</span><span class="n">r7</span><span class="p">,</span> <span class="n">lr</span><span class="p">}</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_SELECTOR_REFERENCES_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC2_0</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r7</span><span class="p">,</span> <span class="n">sp</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_SELECTOR_REFERENCES_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC2_0</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_CLASSLIST_REFERENCES_</span><span class="err">$</span><span class="n">_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC2_1</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_CLASSLIST_REFERENCES_</span><span class="err">$</span><span class="n">_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC2_1</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC2_0:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r1</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'><span class="nl">LPC2_1:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">r1</span><span class="p">]</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r0</span><span class="p">,</span> <span class="p">[</span><span class="n">r0</span><span class="p">]</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_msgSend</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_SELECTOR_REFERENCES_2</span><span class="o">-</span><span class="p">(</span><span class="n">LPC2_2</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_SELECTOR_REFERENCES_2</span><span class="o">-</span><span class="p">(</span><span class="n">LPC2_2</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC2_2:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r1</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">r1</span><span class="p">]</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_msgSend</span>
</span><span class='line'>    <span class="n">pop</span><span class="p">.</span><span class="n">w</span>   <span class="p">{</span><span class="n">r7</span><span class="p">,</span> <span class="n">lr</span><span class="p">}</span>
</span><span class='line'>    <span class="n">b</span><span class="p">.</span><span class="n">w</span>     <span class="n">_objc_autoreleaseReturnValue</span>
</span></code></pre></td></tr></table></div></figure>


<p>The single difference here is the call to <code>objc_autoreleaseReturnValue</code> rather than <code>objc_autorelease</code>. <del>I still don&rsquo;t particularly understand why the compiler is doing something different here, so I&rsquo;ve still to work that one through but</del> The results for the benchmark using this method are as follows (added to the previous results where I&rsquo;ve called this new method, E):</p>

<table>
<thead>
<tr>
<th align="center">   </th>
<th align="center">  <strong>A</strong>  </th>
<th align="center">  <strong>B</strong>  </th>
<th align="center">  <strong>C</strong>  </th>
<th align="center">  <strong>D</strong>  </th>
<th align="center">  <strong>E</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td align="center"><strong>1000</strong> </td>
<td align="center"> 2.264 </td>
<td align="center"> 2.349 </td>
<td align="center"> 2.199 </td>
<td align="center"> 2.394 </td>
<td align="center"> 2.401</td>
</tr>
<tr>
<td align="center"><strong>5000</strong> </td>
<td align="center"> 10.102 </td>
<td align="center"> 10.149 </td>
<td align="center"> 9.993 </td>
<td align="center"> 11.017 </td>
<td align="center"> 11.381</td>
</tr>
<tr>
<td align="center"><strong>10000</strong> </td>
<td align="center"> 19.180 </td>
<td align="center"> 20.148 </td>
<td align="center"> 19.509 </td>
<td align="center"> 20.036 </td>
<td align="center"> 22.120</td>
</tr>
<tr>
<td align="center"><strong>50000</strong> </td>
<td align="center"> 92.357 </td>
<td align="center"> 98.177 </td>
<td align="center"> 104.362 </td>
<td align="center"> 97.099 </td>
<td align="center"> 106.966</td>
</tr>
<tr>
<td align="center"><strong>100000</strong> </td>
<td align="center"> 185.054 </td>
<td align="center"> 199.825 </td>
<td align="center"> 204.560 </td>
<td align="center"> 194.353 </td>
<td align="center"> 223.045</td>
</tr>
<tr>
<td align="center"><strong>500000</strong> </td>
<td align="center"> 924.090 </td>
<td align="center"> 1000.588 </td>
<td align="center"> 1335.106 </td>
<td align="center"> 985.735 </td>
<td align="center"> 1113.261</td>
</tr>
<tr>
<td align="center"><strong>1000000</strong> </td>
<td align="center"> 1863.110 </td>
<td align="center"> 1973.086 </td>
<td align="center"> 2885.719 </td>
<td align="center"> 1977.487 </td>
<td align="center"> 2262.960</td>
</tr>
<tr>
<td align="center"><strong>5000000</strong> </td>
<td align="center"> 9407.941 </td>
<td align="center"> 10245.857 </td>
<td align="center"> 23314.495 </td>
<td align="center"> 9757.074 </td>
<td align="center"> 11419.025</td>
</tr>
<tr>
<td align="center"><strong>10000000</strong> </td>
<td align="center"> 18557.632 </td>
<td align="center"> 20841.905 </td>
<td align="center"> 56602.491 </td>
<td align="center"> 20315.784 </td>
<td align="center"> 22510.462</td>
</tr>
</tbody>
</table>


<p>So that at least explains why method C was so much slower. <del>But I&rsquo;ve no idea why the compiler doesn&rsquo;t emit the same thing when the return type of <code>giveMeAnObject</code> is <code>ClassA*</code> or <code>id</code>.</del></p>

<h2>Update: Turns out, it&rsquo;s a bug</h2>

<p>It <a href="http://stackoverflow.com/a/9180782/1068248">turns out that it&rsquo;s a bug that the compiler</a> (well, the optimiser part of the compiler) did something different for the case of returning <code>id</code> versus <code>ClassA*</code> and the cases of splitting out the <code>alloc + init</code> in the method versus returning on the same line. All of these should compile exactly the same, but they don&rsquo;t in the current version of clang.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A look under ARC’s hood – Episode 3]]></title>
    <link href="http://www.galloway.me.uk/2012/02/a-look-under-arcs-hood-episode-3/"/>
    <updated>2012-02-01T10:46:38+00:00</updated>
    <id>http://www.galloway.me.uk/2012/02/a-look-under-arcs-hood-episode-3</id>
    <content type="html"><![CDATA[<p>This instalment of &ldquo;A look under ARC&rsquo;s hood&rdquo; is all about the new <code>@autoreleasepool</code> directive. <a href="http://clang.llvm.org/docs/AutomaticReferenceCounting.html#autoreleasepool">LLVM tells us</a> that the semantics of autorelease pools has changed with LLVM 3.0 and in particular, I thought it might be interesting to see what ARC is doing when it comes to these.</p>

<!--more-->


<p>So consider the following method:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="kt">void</span> <span class="nf">foo</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="err">@</span><span class="n">autoreleasepool</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">NSNumber</span> <span class="o">*</span><span class="n">number</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSNumber</span> <span class="nl">numberWithInt:</span><span class="mi">0</span><span class="p">];</span>
</span><span class='line'>        <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;number = %p&quot;</span><span class="p">,</span> <span class="n">number</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is entirely contrived, of course, but it should let us see what&rsquo;s going on. In non-ARC land we would assume here that <code>number</code> would be allocated inside <code>numberWithInt:</code> and returned autoreleased. So when the autorelease pool is next drained, it will be released. So let&rsquo;s see if that&rsquo;s what happened (as usual, this is ARMv7 instructions):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'>    <span class="p">.</span><span class="n">globl</span>  <span class="n">_foo</span>
</span><span class='line'>    <span class="p">.</span><span class="n">align</span>  <span class="mi">2</span>
</span><span class='line'>    <span class="p">.</span><span class="n">code</span>   <span class="mi">16</span>
</span><span class='line'>    <span class="p">.</span><span class="n">thumb_func</span>     <span class="n">_foo</span>
</span><span class='line'><span class="nl">_foo:</span>
</span><span class='line'>    <span class="n">push</span>    <span class="p">{</span><span class="n">r4</span><span class="p">,</span> <span class="n">r7</span><span class="p">,</span> <span class="n">lr</span><span class="p">}</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r7</span><span class="p">,</span> <span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">4</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_autoreleasePoolPush</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_SELECTOR_REFERENCES_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC0_0</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movs</span>    <span class="n">r2</span><span class="p">,</span> <span class="err">#</span><span class="mi">0</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_SELECTOR_REFERENCES_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC0_0</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r4</span><span class="p">,</span> <span class="n">r0</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_CLASSLIST_REFERENCES_</span><span class="err">$</span><span class="n">_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC0_1</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC0_0:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r1</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_CLASSLIST_REFERENCES_</span><span class="err">$</span><span class="n">_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC0_1</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC0_1:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">r1</span><span class="p">]</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r0</span><span class="p">,</span> <span class="p">[</span><span class="n">r0</span><span class="p">]</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_msgSend</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r1</span><span class="p">,</span> <span class="n">r0</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L__unnamed_cfstring_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC0_2</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L__unnamed_cfstring_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC0_2</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC0_2:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_NSLog</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">r4</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_autoreleasePoolPop</span>
</span><span class='line'>    <span class="n">pop</span>     <span class="p">{</span><span class="n">r4</span><span class="p">,</span> <span class="n">r7</span><span class="p">,</span> <span class="n">pc</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Well, yes. That&rsquo;s exactly what&rsquo;s happening. We can see the call to push an autorelease pool then a call to <code>numberWithInt:</code> then a call to pop an autorelease pool. Exactly what we&rsquo;d expect. Now let&rsquo;s look at the exact same code compiled under ARC:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'>    <span class="p">.</span><span class="n">globl</span>  <span class="n">_foo</span>
</span><span class='line'>    <span class="p">.</span><span class="n">align</span>  <span class="mi">2</span>
</span><span class='line'>    <span class="p">.</span><span class="n">code</span>   <span class="mi">16</span>
</span><span class='line'>    <span class="p">.</span><span class="n">thumb_func</span>     <span class="n">_foo</span>
</span><span class='line'><span class="nl">_foo:</span>
</span><span class='line'>    <span class="n">push</span>    <span class="p">{</span><span class="n">r4</span><span class="p">,</span> <span class="n">r5</span><span class="p">,</span> <span class="n">r7</span><span class="p">,</span> <span class="n">lr</span><span class="p">}</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r7</span><span class="p">,</span> <span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">8</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_autoreleasePoolPush</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_SELECTOR_REFERENCES_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC0_0</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movs</span>    <span class="n">r2</span><span class="p">,</span> <span class="err">#</span><span class="mi">0</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_SELECTOR_REFERENCES_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC0_0</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r4</span><span class="p">,</span> <span class="n">r0</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_CLASSLIST_REFERENCES_</span><span class="err">$</span><span class="n">_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC0_1</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC0_0:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r1</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_CLASSLIST_REFERENCES_</span><span class="err">$</span><span class="n">_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC0_1</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC0_1:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">r1</span><span class="p">]</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r0</span><span class="p">,</span> <span class="p">[</span><span class="n">r0</span><span class="p">]</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_msgSend</span>
</span><span class='line'>    <span class="err">@</span> <span class="n">InlineAsm</span> <span class="n">Start</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r7</span><span class="p">,</span> <span class="n">r7</span>          <span class="err">@</span> <span class="n">marker</span> <span class="k">for</span> <span class="n">objc_retainAutoreleaseReturnValue</span>
</span><span class='line'>    <span class="err">@</span> <span class="n">InlineAsm</span> <span class="n">End</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_retainAutoreleasedReturnValue</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r5</span><span class="p">,</span> <span class="n">r0</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L__unnamed_cfstring_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC0_2</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L__unnamed_cfstring_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC0_2</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r1</span><span class="p">,</span> <span class="n">r5</span>
</span><span class='line'><span class="nl">LPC0_2:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_NSLog</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">r5</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_release</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">r4</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_autoreleasePoolPop</span>
</span><span class='line'>    <span class="n">pop</span>     <span class="p">{</span><span class="n">r4</span><span class="p">,</span> <span class="n">r5</span><span class="p">,</span> <span class="n">r7</span><span class="p">,</span> <span class="n">pc</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice the calls to <code>objc_retainAutoreleasedReturnValue</code> and <code>objc_release</code>. What&rsquo;s happening there is that ARC has determined for us that it doesn&rsquo;t really need to worry about the autorelease pool that&rsquo;s in place, because it can simply tell the autorelease to not happen (with the call to <code>objc_retainAutoreleasedReturnValue</code>) and then release the object later itself. This is desirable as it means the autorelease logic doesn&rsquo;t have to happen.</p>

<p>Note that the autorelease pool is still required to be pushed and popped because ARC can&rsquo;t know what&rsquo;s going on in the calls to <code>numberWithInt:</code> and <code>NSLog</code> to know if objects will be put into the pool there. If it did know that they didn&rsquo;t autorelease anything then it could actually get rid of the push and pop. Perhaps that kind of logic will come in future versions although I&rsquo;m not quite sure how the semantics of that would work though.</p>

<p>Now let&rsquo;s consider another example which is where we want to use <code>number</code> outside of the scope of the autorelease pool block. This should show us why ARC is a wonder to work with. Consider the following code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="kt">void</span> <span class="nf">bar</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">NSNumber</span> <span class="o">*</span><span class="n">number</span><span class="p">;</span>
</span><span class='line'>    <span class="err">@</span><span class="n">autoreleasepool</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">number</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSNumber</span> <span class="nl">numberWithInt:</span><span class="mi">0</span><span class="p">];</span>
</span><span class='line'>        <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;number = %p&quot;</span><span class="p">,</span> <span class="n">number</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;number = %p&quot;</span><span class="p">,</span> <span class="n">number</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>You might be (correctly) thinking that this is going to cause problems even though it looks perfectly innocuous. It&rsquo;s a problem because <code>number</code> will be allocated inside the autorelease pool block, will be deallocated when the autorelease pool pops but is then used after it&rsquo;s been deallocated. Uh oh! Let&rsquo;s see if we&rsquo;re right by compiling it without ARC enabled:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'>    <span class="p">.</span><span class="n">globl</span>  <span class="n">_bar</span>
</span><span class='line'>    <span class="p">.</span><span class="n">align</span>  <span class="mi">2</span>
</span><span class='line'>    <span class="p">.</span><span class="n">code</span>   <span class="mi">16</span>
</span><span class='line'>    <span class="p">.</span><span class="n">thumb_func</span>     <span class="n">_bar</span>
</span><span class='line'><span class="nl">_bar:</span>
</span><span class='line'>    <span class="n">push</span>    <span class="p">{</span><span class="n">r4</span><span class="p">,</span> <span class="n">r5</span><span class="p">,</span> <span class="n">r6</span><span class="p">,</span> <span class="n">r7</span><span class="p">,</span> <span class="n">lr</span><span class="p">}</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r7</span><span class="p">,</span> <span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">12</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_autoreleasePoolPush</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_SELECTOR_REFERENCES_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_0</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movs</span>    <span class="n">r2</span><span class="p">,</span> <span class="err">#</span><span class="mi">0</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_SELECTOR_REFERENCES_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_0</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r4</span><span class="p">,</span> <span class="n">r0</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_CLASSLIST_REFERENCES_</span><span class="err">$</span><span class="n">_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_1</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC1_0:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r1</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_CLASSLIST_REFERENCES_</span><span class="err">$</span><span class="n">_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_1</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC1_1:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">r1</span><span class="p">]</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r0</span><span class="p">,</span> <span class="p">[</span><span class="n">r0</span><span class="p">]</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_msgSend</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r6</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L__unnamed_cfstring_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_2</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r6</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L__unnamed_cfstring_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_2</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC1_2:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r6</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r5</span><span class="p">,</span> <span class="n">r0</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r1</span><span class="p">,</span> <span class="n">r5</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">r6</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_NSLog</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">r4</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_autoreleasePoolPop</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">r6</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r1</span><span class="p">,</span> <span class="n">r5</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_NSLog</span>
</span><span class='line'>    <span class="n">pop</span>     <span class="p">{</span><span class="n">r4</span><span class="p">,</span> <span class="n">r5</span><span class="p">,</span> <span class="n">r6</span><span class="p">,</span> <span class="n">r7</span><span class="p">,</span> <span class="n">pc</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Obviously no calls to retain, release or autorelease as we&rsquo;d expect since we haven&rsquo;t made any explicitly and we&rsquo;re not using ARC. We can see here that it&rsquo;s been compiled exactly as we&rsquo;d expect from our reasoning before. So let&rsquo;s see what it looks like when ARC gives us a helping hand:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'>    <span class="p">.</span><span class="n">globl</span>  <span class="n">_bar</span>
</span><span class='line'>    <span class="p">.</span><span class="n">align</span>  <span class="mi">2</span>
</span><span class='line'>    <span class="p">.</span><span class="n">code</span>   <span class="mi">16</span>
</span><span class='line'>    <span class="p">.</span><span class="n">thumb_func</span>     <span class="n">_bar</span>
</span><span class='line'><span class="nl">_bar:</span>
</span><span class='line'>    <span class="n">push</span>    <span class="p">{</span><span class="n">r4</span><span class="p">,</span> <span class="n">r5</span><span class="p">,</span> <span class="n">r6</span><span class="p">,</span> <span class="n">r7</span><span class="p">,</span> <span class="n">lr</span><span class="p">}</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r7</span><span class="p">,</span> <span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">12</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_autoreleasePoolPush</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_SELECTOR_REFERENCES_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_0</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movs</span>    <span class="n">r2</span><span class="p">,</span> <span class="err">#</span><span class="mi">0</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r1</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_SELECTOR_REFERENCES_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_0</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r4</span><span class="p">,</span> <span class="n">r0</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_CLASSLIST_REFERENCES_</span><span class="err">$</span><span class="n">_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_1</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC1_0:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r1</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r0</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L_OBJC_CLASSLIST_REFERENCES_</span><span class="err">$</span><span class="n">_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_1</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC1_1:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r1</span><span class="p">,</span> <span class="p">[</span><span class="n">r1</span><span class="p">]</span>
</span><span class='line'>    <span class="n">ldr</span>     <span class="n">r0</span><span class="p">,</span> <span class="p">[</span><span class="n">r0</span><span class="p">]</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_msgSend</span>
</span><span class='line'>    <span class="err">@</span> <span class="n">InlineAsm</span> <span class="n">Start</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r7</span><span class="p">,</span> <span class="n">r7</span>          <span class="err">@</span> <span class="n">marker</span> <span class="k">for</span> <span class="n">objc_retainAutoreleaseReturnValue</span>
</span><span class='line'>    <span class="err">@</span> <span class="n">InlineAsm</span> <span class="n">End</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_retainAutoreleasedReturnValue</span>
</span><span class='line'>    <span class="n">movw</span>    <span class="n">r6</span><span class="p">,</span> <span class="o">:</span><span class="n">lower16</span><span class="o">:</span><span class="p">(</span><span class="n">L__unnamed_cfstring_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_2</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'>    <span class="n">movt</span>    <span class="n">r6</span><span class="p">,</span> <span class="o">:</span><span class="n">upper16</span><span class="o">:</span><span class="p">(</span><span class="n">L__unnamed_cfstring_</span><span class="o">-</span><span class="p">(</span><span class="n">LPC1_2</span><span class="o">+</span><span class="mi">4</span><span class="p">))</span>
</span><span class='line'><span class="nl">LPC1_2:</span>
</span><span class='line'>    <span class="n">add</span>     <span class="n">r6</span><span class="p">,</span> <span class="n">pc</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r5</span><span class="p">,</span> <span class="n">r0</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r1</span><span class="p">,</span> <span class="n">r5</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">r6</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_NSLog</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">r4</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_autoreleasePoolPop</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">r6</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r1</span><span class="p">,</span> <span class="n">r5</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_NSLog</span>
</span><span class='line'>    <span class="n">mov</span>     <span class="n">r0</span><span class="p">,</span> <span class="n">r5</span>
</span><span class='line'>    <span class="n">blx</span>     <span class="n">_objc_release</span>
</span><span class='line'>    <span class="n">pop</span>     <span class="p">{</span><span class="n">r4</span><span class="p">,</span> <span class="n">r5</span><span class="p">,</span> <span class="n">r6</span><span class="p">,</span> <span class="n">r7</span><span class="p">,</span> <span class="n">pc</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Round of applause for ARC please! Notice that it&rsquo;s realised we&rsquo;re using <code>number</code> outside of the scope of the autorelease pool block so it&rsquo;s retained the return value from <code>numberWithInt:</code> just as it did before, but this time it&rsquo;s placed the release at the end of the <code>bar</code> function rather than before the autorelease pool is popped. That will have saved us a crash in some code that we might have thought was correct but actually had a subtle memory management bug.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[UIImageOrientation / EXIF orientation sample images]]></title>
    <link href="http://www.galloway.me.uk/2012/01/uiimageorientation-exif-orientation-sample-images/"/>
    <updated>2012-01-30T18:18:22+00:00</updated>
    <id>http://www.galloway.me.uk/2012/01/uiimageorientation-exif-orientation-sample-images</id>
    <content type="html"><![CDATA[<p>Whilst I was doing some work with images recently I was in desperate need for some sample images which were tagged with the EXIF orientation flag for each of the 8 orientations which are supported by UIImage in its <code>UIImageOrientation</code> metadata. I couldn&rsquo;t find any already out there, so I made my own. And now I&rsquo;m posting them here for anyone who might also find this useful. I now have these saved on my iPhone and use them in apps as test images.</p>

<!--more-->


<p><a href="http://www.galloway.me.uk/media/other/EXIF_Orientation_Samples.zip">Download All</a></p>

<p><img src="http://www.galloway.me.uk/media/images/2012-01-30-uiimageorientation-exif-orientation-sample-images/up-225x300.jpg" alt="" />
<img src="http://www.galloway.me.uk/media/images/2012-01-30-uiimageorientation-exif-orientation-sample-images/up-mirrored-225x300.jpg" alt="" /></p>

<p><img src="http://www.galloway.me.uk/media/images/2012-01-30-uiimageorientation-exif-orientation-sample-images/down-225x300.jpg" alt="" />
<img src="http://www.galloway.me.uk/media/images/2012-01-30-uiimageorientation-exif-orientation-sample-images/down-mirrored-225x300.jpg" alt="" /></p>

<p><img src="http://www.galloway.me.uk/media/images/2012-01-30-uiimageorientation-exif-orientation-sample-images/left-300x225.jpg" alt="" /> <img src="http://www.galloway.me.uk/media/images/2012-01-30-uiimageorientation-exif-orientation-sample-images/left-mirrored-300x225.jpg" alt="" /></p>

<p><img src="http://www.galloway.me.uk/media/images/2012-01-30-uiimageorientation-exif-orientation-sample-images/right-300x225.jpg" alt="" /> <img src="http://www.galloway.me.uk/media/images/2012-01-30-uiimageorientation-exif-orientation-sample-images/right-mirrored-300x225.jpg" alt="" /></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How to visualise affine transforms when drawing with Quartz 2D.]]></title>
    <link href="http://www.galloway.me.uk/2012/01/how-to-visualise-affine-transforms-when-drawing-with-quartz-2d/"/>
    <updated>2012-01-30T18:09:00+00:00</updated>
    <id>http://www.galloway.me.uk/2012/01/how-to-visualise-affine-transforms-when-drawing-with-quartz-2d</id>
    <content type="html"><![CDATA[<p>I had been <a href="http://stackoverflow.com/questions/9062363/cgcontext-drawing-rotated-around-arbitrary-point">struggling with some code</a> that I had to rotate an image whilst drawing it so I decided to sit down and work out a nice way to visualise it as I hadn&rsquo;t seen anything out there really that explained it very well. This is what I came up with&hellip;</p>

<!--more-->


<p>In order to visualise it I decided to create a card with an &lsquo;F&rsquo; on the front and then trace through the &lsquo;F&rsquo; onto the back to that effectively it is mirrored. The purpose of the mirror is to enable me to visualise the case when dealing with images that are mirrored (i.e. <code>UIImageOrientationUpMirrored</code>, <code>UIImageOrientationDownMirrored</code>, etc). Here is an example of my card:</p>

<p><img src="http://www.galloway.me.uk/media/images/2012-01-30-how-to-visualise-affine-transforms-when-drawing-with-quartz-2d/Sample-Card.png" alt="" /></p>

<p>Now we can get to work using that to work out how we might want to translate &amp; rotate a context whilst drawing into. Consider first of all an image that is in the <code>UIImageOrientationDown</code> orientation. So hold your card with the &lsquo;F&rsquo; on it with the front facing you and rotate it through 180 degrees. That is the orientation we want to determine the correct transformation matrix for in this case. Now since Quartz draws with the origin in the bottom right, you need to imagine a coordinate system where the y-axis is going up from the bottom to the top of your card and the x-axis is going across from the left to the right. I like to imagine little arrows going up &amp; left from the bottom left corner of my card.</p>

<p>So to get this to draw into our canvas correctly it&rsquo;s pretty clear that we need to rotate by 180 degrees. A rotation will rotate about the origin of our coordinate system so if we purely rotate by 180 degrees then the image will be drawn the right way up but will lie down and left from the origin. To see why this is, hold your card with your fingers at the bottom left. Now imagine the canvas going up and right from here, the size of the card. Now push the card round from the top right corner by 180 degrees, pivoting about the bottom left. You can see that nothing would be drawn into the canvas! So what we need to do is translate up by the height and right by the width. That then brings the image into the right place in the canvas.</p>

<p>I like to draw out this like so on paper:</p>

<p><img src="http://www.galloway.me.uk/media/images/2012-01-30-how-to-visualise-affine-transforms-when-drawing-with-quartz-2d/Down-Example.png" alt="" /></p>

<p>I think this helps explain it because if at all times you keep your little coordinate arrows on your card lined up with the ones in the diagram, you can visualise what&rsquo;s going on.</p>

<p>Now let&rsquo;s consider a much more complicated example, the case of <code>UIImageOrientationLeftMirrored</code>. Start with your card on its front and on its side with the long side of the &lsquo;F&rsquo; at the bottom. Then flip it over. This is now in the desired orientation.</p>

<p>It&rsquo;s hard to work out from here what needs to be done but if you follow through the diagram below and at all times keeping your little coordinate arrows on your card aligned with the arrows on the diagram then you should be able to convince yourself that it&rsquo;s right.</p>

<p><img src="http://www.galloway.me.uk/media/images/2012-01-30-how-to-visualise-affine-transforms-when-drawing-with-quartz-2d/Left-Mirrored-Example.png" alt="" /></p>

<p>So to follow this you would hold your card with the &lsquo;F&rsquo; in the position described above with its bottom left aligned with the bottom left of the canvas &lsquo;1&rsquo; on the diagram. Then to get to position 2 you would move the card horizontally across the width of the canvas where your little arrows should line up with the arrows in the diagram on canvas &lsquo;2&rsquo;. To get to position 3 you would rotate 90 degrees counter-clockwise (i.e. positive rotation &ndash; which is rotating from the positive x-axis towards the positive y-axis). Then to get to position 4 you need to move the card vertically, which is a translation in positive x if you look at it carefully. Then finally to get to position 5 you need to flip the card along the y-axis which brings the image into the canvas fully and you&rsquo;ll notice the &lsquo;F&rsquo; is the right way up!</p>

<p>Note that if we want to then draw the image we would need to define the rectangle to draw into with a width equal to the canvas height and a height equal to the canvas width because our x axis is now vertical and our y axis is horizontal. Alternatively think of it that the height of the image is the width of the canvas and the width of the image is the height of the canvas.</p>

<p>I used this method to work out how to draw a <code>UIImage</code> rotated correctly to its upright position. Here is that code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">UIImage</span> <span class="o">*</span><span class="n">image</span> <span class="o">=</span> <span class="o">&lt;</span><span class="n">THE_IMAGE</span><span class="o">&gt;</span><span class="p">;</span>
</span><span class='line'><span class="n">CGSize</span> <span class="n">imageSize</span> <span class="o">=</span> <span class="n">image</span><span class="p">.</span><span class="n">size</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="n">CGRect</span> <span class="n">imageRect</span> <span class="o">=</span> <span class="n">CGRectIntegral</span><span class="p">(</span><span class="n">CGRectMake</span><span class="p">(</span><span class="mf">0.0f</span><span class="p">,</span> <span class="mf">0.0f</span><span class="p">,</span> <span class="n">imageSize</span><span class="p">.</span><span class="n">width</span><span class="p">,</span> <span class="n">imageSize</span><span class="p">.</span><span class="n">height</span><span class="p">));</span>
</span><span class='line'><span class="n">CGRect</span> <span class="n">imageTransposedRect</span> <span class="o">=</span> <span class="n">CGRectMake</span><span class="p">(</span><span class="mf">0.0f</span><span class="p">,</span> <span class="mf">0.0f</span><span class="p">,</span> <span class="n">imageSize</span><span class="p">.</span><span class="n">height</span><span class="p">,</span> <span class="n">imageSize</span><span class="p">.</span><span class="n">width</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="n">CGAffineTransform</span> <span class="n">transform</span> <span class="o">=</span> <span class="n">CGAffineTransformIdentity</span><span class="p">;</span>
</span><span class='line'><span class="n">CGRect</span> <span class="n">drawRect</span> <span class="o">=</span> <span class="n">imageRect</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">switch</span> <span class="p">(</span><span class="n">image</span><span class="p">.</span><span class="n">imageOrientation</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">case</span> <span class="nl">UIImageOrientationUp:</span>
</span><span class='line'>        <span class="k">break</span><span class="p">;</span>
</span><span class='line'>    <span class="k">case</span> <span class="nl">UIImageOrientationUpMirrored:</span>
</span><span class='line'>        <span class="n">transform</span> <span class="o">=</span> <span class="n">CGAffineTransformTranslate</span><span class="p">(</span><span class="n">transform</span><span class="p">,</span> <span class="n">rect</span><span class="p">.</span><span class="n">size</span><span class="p">.</span><span class="n">width</span><span class="p">,</span> <span class="mf">0.0f</span><span class="p">);</span>
</span><span class='line'>        <span class="n">transform</span> <span class="o">=</span> <span class="n">CGAffineTransformScale</span><span class="p">(</span><span class="n">transform</span><span class="p">,</span> <span class="o">-</span><span class="mf">1.0f</span><span class="p">,</span> <span class="mf">1.0f</span><span class="p">);</span>
</span><span class='line'>        <span class="k">break</span><span class="p">;</span>
</span><span class='line'>    <span class="k">case</span> <span class="nl">UIImageOrientationDown:</span>
</span><span class='line'>        <span class="n">transform</span> <span class="o">=</span> <span class="n">CGAffineTransformTranslate</span><span class="p">(</span><span class="n">transform</span><span class="p">,</span> <span class="n">rect</span><span class="p">.</span><span class="n">size</span><span class="p">.</span><span class="n">width</span><span class="p">,</span> <span class="n">rect</span><span class="p">.</span><span class="n">size</span><span class="p">.</span><span class="n">height</span><span class="p">);</span>
</span><span class='line'>        <span class="n">transform</span> <span class="o">=</span> <span class="n">CGAffineTransformRotate</span><span class="p">(</span><span class="n">transform</span><span class="p">,</span> <span class="n">M_PI</span><span class="p">);</span>
</span><span class='line'>        <span class="k">break</span><span class="p">;</span>
</span><span class='line'>    <span class="k">case</span> <span class="nl">UIImageOrientationDownMirrored:</span>
</span><span class='line'>        <span class="n">transform</span> <span class="o">=</span> <span class="n">CGAffineTransformTranslate</span><span class="p">(</span><span class="n">transform</span><span class="p">,</span> <span class="mf">0.0f</span><span class="p">,</span> <span class="n">rect</span><span class="p">.</span><span class="n">size</span><span class="p">.</span><span class="n">height</span><span class="p">);</span>
</span><span class='line'>        <span class="n">transform</span> <span class="o">=</span> <span class="n">CGAffineTransformScale</span><span class="p">(</span><span class="n">transform</span><span class="p">,</span> <span class="mf">1.0f</span><span class="p">,</span> <span class="o">-</span><span class="mf">1.0f</span><span class="p">);</span>
</span><span class='line'>        <span class="k">break</span><span class="p">;</span>
</span><span class='line'>    <span class="k">case</span> <span class="nl">UIImageOrientationLeft:</span>
</span><span class='line'>        <span class="n">transform</span> <span class="o">=</span> <span class="n">CGAffineTransformTranslate</span><span class="p">(</span><span class="n">transform</span><span class="p">,</span> <span class="n">rect</span><span class="p">.</span><span class="n">size</span><span class="p">.</span><span class="n">width</span><span class="p">,</span> <span class="mf">0.0f</span><span class="p">);</span>
</span><span class='line'>        <span class="n">transform</span> <span class="o">=</span> <span class="n">CGAffineTransformRotate</span><span class="p">(</span><span class="n">transform</span><span class="p">,</span> <span class="n">M_PI_2</span><span class="p">);</span>
</span><span class='line'>        <span class="n">drawRect</span> <span class="o">=</span> <span class="n">imageTransposedRect</span><span class="p">;</span>
</span><span class='line'>        <span class="k">break</span><span class="p">;</span>
</span><span class='line'>    <span class="k">case</span> <span class="nl">UIImageOrientationLeftMirrored:</span>
</span><span class='line'>        <span class="n">transform</span> <span class="o">=</span> <span class="n">CGAffineTransformTranslate</span><span class="p">(</span><span class="n">transform</span><span class="p">,</span> <span class="n">rect</span><span class="p">.</span><span class="n">size</span><span class="p">.</span><span class="n">width</span><span class="p">,</span> <span class="mf">0.0f</span><span class="p">);</span>
</span><span class='line'>        <span class="n">transform</span> <span class="o">=</span> <span class="n">CGAffineTransformRotate</span><span class="p">(</span><span class="n">transform</span><span class="p">,</span> <span class="n">M_PI_2</span><span class="p">);</span>
</span><span class='line'>        <span class="n">transform</span> <span class="o">=</span> <span class="n">CGAffineTransformTranslate</span><span class="p">(</span><span class="n">transform</span><span class="p">,</span> <span class="n">rect</span><span class="p">.</span><span class="n">size</span><span class="p">.</span><span class="n">height</span><span class="p">,</span> <span class="mf">0.0f</span><span class="p">);</span>
</span><span class='line'>        <span class="n">transform</span> <span class="o">=</span> <span class="n">CGAffineTransformScale</span><span class="p">(</span><span class="n">transform</span><span class="p">,</span> <span class="o">-</span><span class="mf">1.0f</span><span class="p">,</span> <span class="mf">1.0f</span><span class="p">);</span>
</span><span class='line'>        <span class="n">drawRect</span> <span class="o">=</span> <span class="n">imageTransposedRect</span><span class="p">;</span>
</span><span class='line'>        <span class="k">break</span><span class="p">;</span>
</span><span class='line'>    <span class="k">case</span> <span class="nl">UIImageOrientationRight:</span>
</span><span class='line'>        <span class="n">transform</span> <span class="o">=</span> <span class="n">CGAffineTransformTranslate</span><span class="p">(</span><span class="n">transform</span><span class="p">,</span> <span class="mf">0.0f</span><span class="p">,</span> <span class="n">rect</span><span class="p">.</span><span class="n">size</span><span class="p">.</span><span class="n">height</span><span class="p">);</span>
</span><span class='line'>        <span class="n">transform</span> <span class="o">=</span> <span class="n">CGAffineTransformRotate</span><span class="p">(</span><span class="n">transform</span><span class="p">,</span> <span class="o">-</span><span class="n">M_PI_2</span><span class="p">);</span>
</span><span class='line'>        <span class="n">drawRect</span> <span class="o">=</span> <span class="n">imageTransposedRect</span><span class="p">;</span>
</span><span class='line'>        <span class="k">break</span><span class="p">;</span>
</span><span class='line'>    <span class="k">case</span> <span class="nl">UIImageOrientationRightMirrored:</span>
</span><span class='line'>        <span class="n">transform</span> <span class="o">=</span> <span class="n">CGAffineTransformScale</span><span class="p">(</span><span class="n">transform</span><span class="p">,</span> <span class="o">-</span><span class="mf">1.0f</span><span class="p">,</span> <span class="mf">1.0f</span><span class="p">);</span>
</span><span class='line'>        <span class="n">transform</span> <span class="o">=</span> <span class="n">CGAffineTransformRotate</span><span class="p">(</span><span class="n">transform</span><span class="p">,</span> <span class="n">M_PI_2</span><span class="p">);</span>
</span><span class='line'>        <span class="n">drawRect</span> <span class="o">=</span> <span class="n">imageTransposedRect</span><span class="p">;</span>
</span><span class='line'>        <span class="k">break</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">CGColorSpaceRef</span> <span class="n">colorSpace</span> <span class="o">=</span> <span class="n">CGColorSpaceCreateDeviceRGB</span><span class="p">();</span>
</span><span class='line'><span class="n">CGContextRef</span> <span class="n">bitmap</span> <span class="o">=</span> <span class="n">CGBitmapContextCreate</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span>
</span><span class='line'>                                            <span class="n">drawRect</span><span class="p">.</span><span class="n">size</span><span class="p">.</span><span class="n">width</span><span class="p">,</span>
</span><span class='line'>                                            <span class="n">drawRect</span><span class="p">.</span><span class="n">size</span><span class="p">.</span><span class="n">height</span><span class="p">,</span>
</span><span class='line'>                                            <span class="mi">8</span><span class="p">,</span>
</span><span class='line'>                                            <span class="mi">0</span><span class="p">,</span>
</span><span class='line'>                                            <span class="n">colorSpace</span><span class="p">,</span>
</span><span class='line'>                                            <span class="n">kCGImageAlphaPremultipliedLast</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="n">CGContextConcatCTM</span><span class="p">(</span><span class="n">bitmap</span><span class="p">,</span> <span class="n">transform</span><span class="p">);</span>
</span><span class='line'><span class="n">CGContextDrawImage</span><span class="p">(</span><span class="n">bitmap</span><span class="p">,</span> <span class="n">drawRect</span><span class="p">,</span> <span class="n">image</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="n">CGImageRef</span> <span class="n">newImageRef</span> <span class="o">=</span> <span class="n">CGBitmapContextCreateImage</span><span class="p">(</span><span class="n">bitmap</span><span class="p">);</span>
</span><span class='line'><span class="n">UIImage</span> <span class="o">*</span><span class="n">newImage</span> <span class="o">=</span> <span class="p">[</span><span class="n">UIImage</span> <span class="nl">imageWithCGImage:</span><span class="n">newImageRef</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'><span class="n">CGContextRelease</span><span class="p">(</span><span class="n">bitmap</span><span class="p">);</span>
</span><span class='line'><span class="n">CGImageRelease</span><span class="p">(</span><span class="n">newImageRef</span><span class="p">);</span>
</span><span class='line'><span class="n">CGColorSpaceRelease</span><span class="p">(</span><span class="n">colorSpace</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>
]]></content>
  </entry>
  
</feed>
