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

  <title><![CDATA[joelparsons.net]]></title>
  <link href="http://joelparsons.github.io/atom.xml" rel="self"/>
  <link href="http://joelparsons.github.io/"/>
  <updated>2013-09-16T11:21:43+01:00</updated>
  <id>http://joelparsons.github.io/</id>
  <author>
    <name><![CDATA[Joel Parsons]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Debugging Like a Gentleman]]></title>
    <link href="http://joelparsons.github.io/blog/2013/09/16/debugging-like-a-gentleman/"/>
    <updated>2013-09-16T08:05:00+01:00</updated>
    <id>http://joelparsons.github.io/blog/2013/09/16/debugging-like-a-gentleman</id>
    <content type="html"><![CDATA[<p>I was listening to an <a href="http://edgecasesshow.com/062-primal-debugging-systems.html">episode</a> of the excellent podcast <a href="http://edgecasesshow.com">&ldquo;Edge Cases&rdquo;</a> by Andrew Pontious and Wolf Rentzsch titled <a href="http://edgecasesshow.com/062-primal-debugging-systems.html">&ldquo;Primal Debugging Systems&rdquo;</a> and they basically said that for all the debugging systems we have these days sometims they will just use <code>NSLog</code> statements to debug (Like an animal) because it was easier than getting information out of lldb. While sometimes an <code>NSLog</code> can be enlightening I have a few quick tips that can have you using lldb like a pro in very little time at all.</p>

<!-- MORE -->


<h2>Breakpoints</h2>

<p>This post is all about the &ldquo;console&rdquo; in Xcode. The area of the Xcode interface that pops up when you run your app using the &ldquo;Run&rdquo; scheme which outputs your <code>NSLog</code> statements. This is all fine and dandy but when your code hits a breakpoint thats when the magic happens. The console turns into a prompt and is ready to accept commands. Before learning how to use the console you need to know how to set a breakpoint. Luckily its incredibly easy!</p>

<p>A breakpoint is a place where the debugger will stop the code running when the path of execution gets to that point. From the breakpoint you can then inspect the runtime and even execute the next satements one by one, helping you to understand what is happening in your code. To set a breakpoint you find the line of code you would like the debugger to stop at and click next to that line in the gutter of the xcode editor window.</p>

<p><img src="http://joelparsons.github.io/images/debugging/breakpoint.png" title="" alt="An image of a blue breakpoint arrow" /></p>

<p>You can also set breakpoints to stop code based on symbols you dont have in code you can edit, like framework symbols, by setting a symbolic breakpoint in the Xcode breakpoint navigator.</p>

<p><img src="http://joelparsons.github.io/images/debugging/navigator.png" title="" alt="The breakpoint navigator" /></p>

<p>To set a symbolic breakpoint click the plus button in the lower left hand corner and click &ldquo;Add Symbolic Breakpoint&rdquo;. You then enter a symbol in the form suggested by the popover:</p>

<figure class='code'> <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="c1">//For instance methods:</span>
</span><span class='line'>    <span class="o">-</span><span class="p">[</span><span class="n">NSClassname</span> <span class="nl">some:selector:with:args:</span><span class="p">]</span>
</span><span class='line'>    <span class="c1">//For Class Methods</span>
</span><span class='line'>    <span class="o">+</span><span class="p">[</span><span class="n">NSClassname</span> <span class="nl">someClassMethod:withArgs:</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p><img src="http://joelparsons.github.io/images/debugging/symbolicAdd.png" title="" alt="the box where you add a symbolic breakpoint" /></p>

<p>You can also set a breakpont for exceptions, stopping the code at the point the exception is thrown rather than when the app terminates due to the exception being thrown. You do this from the same add button, instead selecting &ldquo;Add Exception Breakpoint&rdquo;.</p>

<p><img src="http://joelparsons.github.io/images/debugging/addbutton.png" title="" alt="the plus button for adding a breakpoint" /></p>

<h2>po</h2>

<p>So your code hits a breakpoint. What next? Xcode will show you all the variables in scope in the right hand &ldquo;Variables View&rdquo; of the debugger pane that pops up from the bottom. In Xcode 5 this view has gotten some really impressive quicklook features but thats all point and click. I&rsquo;m here to tell you about some commands that you can run in the debugger area. If your code is stopped at a breakpoint you will get the lldb prompt:</p>

<figure class='code'> <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='obj-c'><span class='line'><span class="p">(</span><span class="n">lldb</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Rather unassuming. The first command we will try is <code>po</code>. <code>po</code> prints out objective-c objects. Well technically it prints out the result of the <code>-(NSString*)description</code> method defined on <code>NSObject</code>. How useful that information is is up to the developer of the class you are printing. You can print any variables in scope by typing <code>po &lt;variablename&gt;</code></p>

<p>Great! Most Apple classes have some great descriptions. You can also print the result of methods on your classes if those methods return Objective-C Objects. The debugger will call <code>-(NSString *)description</code> on the results of that method and print that. Example:</p>

<figure class='code'> <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="p">(</span><span class="n">lldb</span><span class="p">)</span> <span class="n">po</span> <span class="p">[</span><span class="n">UIApplication</span> <span class="n">sharedApplication</span><span class="p">]</span>
</span><span class='line'><span class="o">&lt;</span><span class="nl">UIApplication:</span> <span class="mh">0xb074780</span><span class="o">&gt;</span>
</span><span class='line'><span class="p">(</span><span class="n">lldb</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Not the most useful result. Lets chain some messages together and see what happens:</p>

<figure class='code'> <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="p">(</span><span class="n">lldb</span><span class="p">)</span> <span class="n">po</span> <span class="p">[[[</span><span class="n">UIApplication</span> <span class="n">sharedApplication</span><span class="p">]</span> <span class="n">delegate</span><span class="p">]</span> <span class="n">window</span><span class="p">]</span>
</span><span class='line'><span class="o">&lt;</span><span class="nl">UIWindow:</span> <span class="mh">0xb2b3340</span><span class="p">;</span> <span class="n">frame</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span> <span class="mi">0</span><span class="p">;</span> <span class="mi">320</span> <span class="mi">480</span><span class="p">);</span> <span class="n">opaque</span> <span class="o">=</span> <span class="n">NO</span><span class="p">;</span> <span class="n">autoresize</span> <span class="o">=</span> <span class="n">RM</span><span class="o">+</span><span class="n">BM</span><span class="p">;</span> <span class="n">layer</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nl">UIWindowLayer:</span> <span class="mh">0xb2b3440</span><span class="o">&gt;&gt;</span>
</span><span class='line'><span class="p">(</span><span class="n">lldb</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Excellent! We&rsquo;ve printed the description of the main window. Heres a cool snippet that can help you debug your view heierarchy from anywhere you break in your app:</p>

<figure class='code'> <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='obj-c'><span class='line'><span class="p">(</span><span class="n">lldb</span><span class="p">)</span> <span class="n">po</span> <span class="p">[[[[</span><span class="n">UIApplication</span> <span class="n">sharedApplication</span><span class="p">]</span> <span class="n">delegate</span><span class="p">]</span> <span class="n">window</span><span class="p">]</span> <span class="n">recursiveDescription</span><span class="p">]</span>
</span><span class='line'><span class="o">&lt;</span><span class="nl">UIWindow:</span> <span class="mh">0xb2b3340</span><span class="p">;</span> <span class="n">frame</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span> <span class="mi">0</span><span class="p">;</span> <span class="mi">320</span> <span class="mi">480</span><span class="p">);</span> <span class="n">opaque</span> <span class="o">=</span> <span class="n">NO</span><span class="p">;</span> <span class="n">autoresize</span> <span class="o">=</span> <span class="n">RM</span><span class="o">+</span><span class="n">BM</span><span class="p">;</span> <span class="n">layer</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nl">UIWindowLayer:</span> <span class="mh">0xb2b3440</span><span class="o">&gt;&gt;</span>
</span><span class='line'>   <span class="o">|</span> <span class="o">&lt;</span><span class="nl">UIView:</span> <span class="mh">0xb07c6b0</span><span class="p">;</span> <span class="n">frame</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span> <span class="mi">20</span><span class="p">;</span> <span class="mi">320</span> <span class="mi">460</span><span class="p">);</span> <span class="n">autoresize</span> <span class="o">=</span> <span class="n">W</span><span class="o">+</span><span class="n">H</span><span class="p">;</span> <span class="n">layer</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nl">CALayer:</span> <span class="mh">0xb07c710</span><span class="o">&gt;&gt;</span>
</span><span class='line'>   <span class="o">|</span>    <span class="o">|</span> <span class="o">&lt;</span><span class="nl">UIImageView:</span> <span class="mh">0xb07c740</span><span class="p">;</span> <span class="n">frame</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span> <span class="mi">0</span><span class="p">;</span> <span class="mi">320</span> <span class="mi">460</span><span class="p">);</span> <span class="n">autoresize</span> <span class="o">=</span> <span class="n">H</span><span class="p">;</span> <span class="n">userInteractionEnabled</span> <span class="o">=</span> <span class="n">NO</span><span class="p">;</span> <span class="n">layer</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nl">CALayer:</span> <span class="mh">0xb07c7a0</span><span class="o">&gt;&gt;</span>
</span><span class='line'>   <span class="o">|</span>    <span class="o">|</span> <span class="o">&lt;</span><span class="nl">UIView:</span> <span class="mh">0xb07bb10</span><span class="p">;</span> <span class="n">frame</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span> <span class="o">-</span><span class="mi">88</span><span class="p">;</span> <span class="mi">320</span> <span class="mi">248</span><span class="p">);</span> <span class="n">alpha</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">autoresize</span> <span class="o">=</span> <span class="n">W</span><span class="o">+</span><span class="n">TM</span><span class="p">;</span> <span class="n">layer</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nl">CALayer:</span> <span class="mh">0xb076bf0</span><span class="o">&gt;&gt;</span>
</span><span class='line'>   <span class="o">|</span>    <span class="o">|</span>    <span class="o">|</span> <span class="o">&lt;</span><span class="nl">UIImageView:</span> <span class="mh">0xb077490</span><span class="p">;</span> <span class="n">frame</span> <span class="o">=</span> <span class="p">(</span><span class="mi">196</span> <span class="mi">51</span><span class="p">;</span> <span class="mi">102</span> <span class="mi">55</span><span class="p">);</span> <span class="n">transform</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">45</span><span class="p">,</span> <span class="mi">0</span><span class="p">];</span> <span class="n">clipsToBounds</span> <span class="o">=</span> <span class="n">YES</span><span class="p">;</span> <span class="n">opaque</span> <span class="o">=</span> <span class="n">NO</span><span class="p">;</span> <span class="n">animations</span> <span class="o">=</span> <span class="p">{</span> <span class="n">transform</span><span class="o">=&lt;</span><span class="nl">CABasicAnimation:</span> <span class="mh">0xb07b630</span><span class="o">&gt;</span><span class="p">;</span> <span class="p">};</span> <span class="n">layer</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nl">CALayer:</span> <span class="mh">0xb076700</span><span class="o">&gt;&gt;</span>
</span><span class='line'>   <span class="o">|</span>    <span class="o">|</span>    <span class="o">|</span> <span class="o">&lt;</span><span class="nl">UIImageView:</span> <span class="mh">0xb078ba0</span><span class="p">;</span> <span class="n">frame</span> <span class="o">=</span> <span class="p">(</span><span class="mi">254</span> <span class="mi">151</span><span class="p">;</span> <span class="mi">88</span> <span class="mi">30</span><span class="p">);</span> <span class="n">transform</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">0</span><span class="p">];</span> <span class="n">clipsToBounds</span> <span class="o">=</span> <span class="n">YES</span><span class="p">;</span> <span class="n">opaque</span> <span class="o">=</span> <span class="n">NO</span><span class="p">;</span> <span class="n">animations</span> <span class="o">=</span> <span class="p">{</span> <span class="n">transform</span><span class="o">=&lt;</span><span class="nl">CABasicAnimation:</span> <span class="mh">0xb07cb20</span><span class="o">&gt;</span><span class="p">;</span> <span class="p">};</span> <span class="n">layer</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nl">CALayer:</span> <span class="mh">0xb078c00</span><span class="o">&gt;&gt;</span>
</span><span class='line'>   <span class="o">|</span>    <span class="o">|</span>    <span class="o">|</span> <span class="o">&lt;</span><span class="nl">UIImageView:</span> <span class="mh">0xb079ae0</span><span class="p">;</span> <span class="n">frame</span> <span class="o">=</span> <span class="p">(</span><span class="mi">176</span> <span class="mi">130</span><span class="p">;</span> <span class="mi">66</span> <span class="mi">30</span><span class="p">);</span> <span class="n">transform</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">41</span><span class="p">,</span> <span class="mi">0</span><span class="p">];</span> <span class="n">clipsToBounds</span> <span class="o">=</span> <span class="n">YES</span><span class="p">;</span> <span class="n">opaque</span> <span class="o">=</span> <span class="n">NO</span><span class="p">;</span> <span class="n">animations</span> <span class="o">=</span> <span class="p">{</span> <span class="n">transform</span><span class="o">=&lt;</span><span class="nl">CABasicAnimation:</span> <span class="mh">0xb07cce0</span><span class="o">&gt;</span><span class="p">;</span> <span class="p">};</span> <span class="n">layer</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nl">CALayer:</span> <span class="mh">0xb079b40</span><span class="o">&gt;&gt;</span>
</span><span class='line'>   <span class="o">|</span>    <span class="o">|</span>    <span class="o">|</span> <span class="o">&lt;</span><span class="nl">UIImageView:</span> <span class="mh">0xb07aa00</span><span class="p">;</span> <span class="n">frame</span> <span class="o">=</span> <span class="p">(</span><span class="mi">5</span> <span class="mi">179</span><span class="p">;</span> <span class="mi">64</span> <span class="mi">30</span><span class="p">);</span> <span class="n">transform</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">49</span><span class="p">,</span> <span class="mi">0</span><span class="p">];</span> <span class="n">clipsToBounds</span> <span class="o">=</span> <span class="n">YES</span><span class="p">;</span> <span class="n">opaque</span> <span class="o">=</span> <span class="n">NO</span><span class="p">;</span> <span class="n">animations</span> <span class="o">=</span> <span class="p">{</span> <span class="n">transform</span><span class="o">=&lt;</span><span class="nl">CABasicAnimation:</span> <span class="mh">0xb07d3b0</span><span class="o">&gt;</span><span class="p">;</span> <span class="p">};</span> <span class="n">layer</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nl">CALayer:</span> <span class="mh">0xb07aa60</span><span class="o">&gt;&gt;</span>
</span><span class='line'>   <span class="o">|</span>    <span class="o">|</span>    <span class="o">|</span> <span class="o">&lt;</span><span class="nl">UIImageView:</span> <span class="mh">0xb077a10</span><span class="p">;</span> <span class="n">frame</span> <span class="o">=</span> <span class="p">(</span><span class="mi">37</span> <span class="mi">37</span><span class="p">;</span> <span class="mi">93</span> <span class="mi">43</span><span class="p">);</span> <span class="n">transform</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">0</span><span class="p">];</span> <span class="n">clipsToBounds</span> <span class="o">=</span> <span class="n">YES</span><span class="p">;</span> <span class="n">opaque</span> <span class="o">=</span> <span class="n">NO</span><span class="p">;</span> <span class="n">animations</span> <span class="o">=</span> <span class="p">{</span> <span class="n">transform</span><span class="o">=&lt;</span><span class="nl">CABasicAnimation:</span> <span class="mh">0xb07c960</span><span class="o">&gt;</span><span class="p">;</span> <span class="p">};</span> <span class="n">layer</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nl">CALayer:</span> <span class="mh">0xb077a70</span><span class="o">&gt;&gt;</span>
</span><span class='line'>   <span class="o">|</span>    <span class="o">|</span>    <span class="o">|</span> <span class="o">&lt;</span><span class="nl">UIImageView:</span> <span class="mh">0xb07b990</span><span class="p">;</span> <span class="n">frame</span> <span class="o">=</span> <span class="p">(</span><span class="o">-</span><span class="mi">49</span> <span class="mi">108</span><span class="p">;</span> <span class="mi">88</span> <span class="mi">30</span><span class="p">);</span> <span class="n">transform</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">21</span><span class="p">,</span> <span class="mi">0</span><span class="p">];</span> <span class="n">clipsToBounds</span> <span class="o">=</span> <span class="n">YES</span><span class="p">;</span> <span class="n">opaque</span> <span class="o">=</span> <span class="n">NO</span><span class="p">;</span> <span class="n">animations</span> <span class="o">=</span> <span class="p">{</span> <span class="n">transform</span><span class="o">=&lt;</span><span class="nl">CABasicAnimation:</span> <span class="mh">0xb07d570</span><span class="o">&gt;</span><span class="p">;</span> <span class="p">};</span> <span class="n">layer</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nl">CALayer:</span> <span class="mh">0xb07b9f0</span><span class="o">&gt;&gt;</span>
</span><span class='line'>   <span class="o">|</span>    <span class="o">|</span> <span class="o">&lt;</span><span class="nl">UIView:</span> <span class="mh">0xb07c620</span><span class="p">;</span> <span class="n">frame</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span> <span class="mi">0</span><span class="p">;</span> <span class="mi">320</span> <span class="mi">460</span><span class="p">);</span> <span class="n">autoresize</span> <span class="o">=</span> <span class="n">W</span><span class="o">+</span><span class="n">H</span><span class="p">;</span> <span class="n">layer</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nl">CALayer:</span> <span class="mh">0xb07c680</span><span class="o">&gt;&gt;</span>
</span><span class='line'><span class="p">(</span><span class="n">lldb</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Printing Pointers</h3>

<p>So if we look at the last example, what if I want to print information about the layer of the window? I could totally do this:</p>

<figure class='code'> <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='obj-c'><span class='line'><span class="p">(</span><span class="n">lldb</span><span class="p">)</span> <span class="n">po</span> <span class="p">[[[[</span><span class="n">UIApplication</span> <span class="n">sharedApplication</span><span class="p">]</span> <span class="n">delegate</span><span class="p">]</span> <span class="n">window</span><span class="p">]</span> <span class="n">layer</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>OR I could take the pointer referenced in the previous printout and <code>po</code> that instead:</p>

<figure class='code'> <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="p">(</span><span class="n">lldb</span><span class="p">)</span> <span class="n">po</span> <span class="mh">0xb2b3440</span>
</span><span class='line'><span class="o">&lt;</span><span class="nl">UIWindowLayer:</span><span class="mh">0xb2b3440</span><span class="p">;</span> <span class="n">position</span> <span class="o">=</span> <span class="n">CGPoint</span> <span class="p">(</span><span class="mi">160</span> <span class="mi">240</span><span class="p">);</span> <span class="n">bounds</span> <span class="o">=</span> <span class="n">CGRect</span> <span class="p">(</span><span class="mi">0</span> <span class="mi">0</span><span class="p">;</span> <span class="mi">320</span> <span class="mi">480</span><span class="p">);</span> <span class="n">delegate</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nl">UIWindow:</span> <span class="mh">0xb2b3340</span><span class="p">;</span> <span class="n">frame</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span> <span class="mi">0</span><span class="p">;</span> <span class="mi">320</span> <span class="mi">480</span><span class="p">);</span> <span class="n">opaque</span> <span class="o">=</span> <span class="n">NO</span><span class="p">;</span> <span class="n">autoresize</span> <span class="o">=</span> <span class="n">RM</span><span class="o">+</span><span class="n">BM</span><span class="p">;</span> <span class="n">layer</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nl">UIWindowLayer:</span> <span class="mh">0xb2b3440</span><span class="o">&gt;&gt;</span><span class="p">;</span> <span class="n">sublayers</span> <span class="o">=</span> <span class="p">(</span><span class="o">&lt;</span><span class="nl">CALayer:</span> <span class="mh">0xb07c710</span><span class="o">&gt;</span><span class="p">);</span> <span class="n">clearsContext</span> <span class="o">=</span> <span class="n">NO</span><span class="p">;</span> <span class="n">backgroundColor</span> <span class="o">=</span> <span class="o">&lt;</span><span class="n">CGColor</span> <span class="mh">0xb2b3a00</span><span class="o">&gt;</span> <span class="p">[</span><span class="o">&lt;</span><span class="n">CGColorSpace</span> <span class="mh">0xb279620</span><span class="o">&gt;</span> <span class="p">(</span><span class="n">kCGColorSpaceDeviceRGB</span><span class="p">)]</span> <span class="p">(</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="p">)</span><span class="o">&gt;</span>
</span><span class='line'><span class="p">(</span><span class="n">lldb</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can even send messages to the object at that pointer like you would a named variable:</p>

<figure class='code'> <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="p">(</span><span class="n">lldb</span><span class="p">)</span> <span class="n">po</span> <span class="p">[</span><span class="mh">0xb2b3440</span> <span class="n">delegate</span><span class="p">]</span>
</span><span class='line'><span class="o">&lt;</span><span class="nl">UIWindow:</span> <span class="mh">0xb2b3340</span><span class="p">;</span> <span class="n">frame</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span> <span class="mi">0</span><span class="p">;</span> <span class="mi">320</span> <span class="mi">480</span><span class="p">);</span> <span class="n">opaque</span> <span class="o">=</span> <span class="n">NO</span><span class="p">;</span> <span class="n">autoresize</span> <span class="o">=</span> <span class="n">RM</span><span class="o">+</span><span class="n">BM</span><span class="p">;</span> <span class="n">layer</span> <span class="o">=</span> <span class="o">&lt;</span><span class="nl">UIWindowLayer:</span> <span class="mh">0xb2b3440</span><span class="o">&gt;&gt;</span>
</span><span class='line'><span class="p">(</span><span class="n">lldb</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can also even aritrarily pause the execution of your app using the pause button (where the continue button is when your app hits a breakpoint) and <code>po</code> that variable, or some property of it without even needing a breakpoint! Just remember that pointers will probably change from run to run of your app.</p>

<h3>Rinse and Repeat</h3>

<p>Pretty short section but its worth mentioning that like in a terminal, hitting the up arrow will cycle through your debugger command history. That is all!</p>

<h2>Printing Core Foundation Things</h2>

<p>So this is all great until you want to print a <code>CGRect</code>, <code>CGPoint</code>, or even a <code>CGAffineTransform</code>. In fact any of the C-struct style objective-c things we pass around can also be printed out by the debugger really easily. The long command is <code>print</code> but you only need to type <code>p</code>. This time, however you need to tell the debugger what kind of struct you are expecting to get a decent output. Its easier to demo this feature than to explain it so I put a breakpoint inside <code>-(void)viewDidAppear:(BOOL)animated</code> of a <code>UIViewController</code>. Lets see what debugger magic I can work:</p>

<figure class='code'> <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="p">(</span><span class="n">lldb</span><span class="p">)</span> <span class="n">p</span> <span class="p">(</span><span class="kt">BOOL</span><span class="p">)</span> <span class="n">animated</span>
</span><span class='line'><span class="p">(</span><span class="kt">BOOL</span><span class="p">)</span> <span class="n">$0</span> <span class="o">=</span> <span class="n">NO</span>
</span><span class='line'><span class="p">(</span><span class="n">lldb</span><span class="p">)</span> <span class="n">p</span> <span class="p">(</span><span class="n">CGRect</span><span class="p">)</span> <span class="p">[[</span><span class="n">self</span> <span class="n">view</span><span class="p">]</span><span class="n">frame</span><span class="p">]</span>
</span><span class='line'><span class="p">(</span><span class="n">CGRect</span><span class="p">)</span> <span class="n">$1</span> <span class="o">=</span> <span class="n">origin</span><span class="o">=</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mi">20</span><span class="p">)</span> <span class="n">size</span><span class="o">=</span><span class="p">(</span><span class="n">width</span><span class="o">=</span><span class="mi">320</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="mi">460</span><span class="p">)</span>
</span><span class='line'><span class="p">(</span><span class="n">lldb</span><span class="p">)</span> <span class="n">p</span> <span class="p">(</span><span class="n">CGAffineTransform</span><span class="p">)</span> <span class="p">[[</span><span class="n">self</span> <span class="n">view</span><span class="p">]</span> <span class="n">transform</span><span class="p">]</span>
</span><span class='line'><span class="p">(</span><span class="n">CGAffineTransform</span><span class="p">)</span> <span class="n">$2</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">a</span> <span class="o">=</span> <span class="mi">1</span>
</span><span class='line'>  <span class="n">b</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'>  <span class="n">c</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'>  <span class="n">d</span> <span class="o">=</span> <span class="mi">1</span>
</span><span class='line'>  <span class="n">tx</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'>  <span class="n">ty</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="p">(</span><span class="n">lldb</span><span class="p">)</span> <span class="n">p</span> <span class="p">(</span><span class="n">CGFloat</span><span class="p">)</span> <span class="p">[[</span><span class="n">self</span> <span class="n">view</span><span class="p">]</span> <span class="n">alpha</span><span class="p">]</span>
</span><span class='line'><span class="p">(</span><span class="n">CGFloat</span><span class="p">)</span> <span class="n">$4</span> <span class="o">=</span> <span class="mi">1</span>
</span></code></pre></td></tr></table></div></figure>


<p>Easy to use and awesome.</p>

<p>Hopefully these simple tips can help make your life debugging easier!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The Queue Observer Pattern]]></title>
    <link href="http://joelparsons.github.io/blog/2013/09/09/the-queue-observer-pattern/"/>
    <updated>2013-09-09T00:28:00+01:00</updated>
    <id>http://joelparsons.github.io/blog/2013/09/09/the-queue-observer-pattern</id>
    <content type="html"><![CDATA[<p>I&rsquo;ve been using the &ldquo;new&rdquo; block based <code>NSNotificationCenter</code> addObserver methods for a long time now but I&rsquo;ve come across some projects that use the old target action style notifiction listening so I thought I would post about why I believe this newer method is better.</p>

<!-- MORE -->


<p>To recap the old way of subscribing to <code>NSNotifications</code> from an <code>NSNotificationCenter</code> was like this:</p>

<figure class='code'> <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="n">NotificationCenter</span> <span class="n">defaultCenter</span><span class="p">]</span> <span class="nl">addObserver:</span><span class="n">self</span>
</span><span class='line'>                                     <span class="nl">selector:</span><span class="k">@selector</span><span class="p">(</span><span class="nl">someSelector:</span><span class="p">)</span>
</span><span class='line'>                                         <span class="nl">name:</span><span class="n">NSSomeNotificationName</span>
</span><span class='line'>                                       <span class="nl">object:</span><span class="nb">nil</span><span class="p">];</span>
</span></code></pre></td></tr></table></div></figure>


<p>This method is not without its problems in the current versions of Xcode. For example if one was to use the Refactor Rename tool it doesn&rsquo;t automatically rename the selector in the <code>@selector()</code> block. Currently Xcode only suggests the changes.</p>

<p><img src="http://joelparsons.github.io/images/refactor.png" title="" alt="Refactor Rename not picking up selector automatically" /></p>

<p>Secondly you will appear to have a dead method when using the Xcode Callers list. The Callers list shows all the methods across the project that call that particular selector. When set as the selector of a notification it wont show in the callers list. While it may be obvious you intend the method to fire as a result of a notification you would still have to search for the notification listening code to find out if it existed and the <code>:(NSNotification *)</code> parameter is optional.</p>

<p><img src="http://joelparsons.github.io/images/callers_list.png" title="" alt="The callers menu" /></p>

<p>Thirdly this method is more crash prone. If the observer is deallocated without you calling <code>[[NSNotificationCenter defaultCenter] removeObserver:self];</code> your app will crash. Admittedly in the scope of <code>NSNotificationCenter</code> observers this can be a good thing, alerting the programmer to a forgotten call to <code>removeObserver:</code> but its not a good bug to have slip through QA and land infront of users when theres an alternative that can fail silently.</p>

<h2>The Modern Way</h2>

<p>So the &ldquo;new&rdquo; alternative (Available in iOS 4.0 and later) is the following:</p>

<figure class='code'> <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='obj-c'><span class='line'><span class="kt">id</span> <span class="n">observer</span> <span class="o">=</span> <span class="p">[[</span><span class="n">NSNotificationCenter</span> <span class="n">defaultCenter</span><span class="p">]</span> <span class="nl">addObserverForName:</span><span class="n">NSSomeNotificationName</span>
</span><span class='line'>                                                                <span class="nl">object:</span><span class="n">self</span>
</span><span class='line'>                                                                 <span class="nl">queue:</span><span class="p">[</span><span class="n">NSOperationQueue</span> <span class="n">mainQueue</span><span class="p">]</span>
</span><span class='line'>                                                            <span class="nl">usingBlock:</span><span class="o">^</span><span class="p">(</span><span class="n">NSNotification</span> <span class="o">*</span><span class="n">note</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>                                                                <span class="p">}];</span>
</span></code></pre></td></tr></table></div></figure>


<p>The first thing you might notice is that you supply a block that is invoked when the notification is fired. You can also specify a queue for this to be executed on. Compared to the old method which will call all observers in turn and wait for their methods to finish before calling the next one queueing these blocks will exit immeadiately, even when queued to run on the main thread. If you know the work in the block will take time you can even farm it off to another queue right in the listener method.</p>

<p>But what about that wierd observer object. The method returns an object of opaque, unspecified type that you have to keep around. The reason is that your class is no longer the observer here, the returned object is! This is why this new method can fail silently if the end recipient of these notifications, <code>self</code>, gets deallocated without calling <code>removeObserver:</code>, the new observer object is actually retained by the notification center and will stay around.</p>

<h3>Caveats</h3>

<p>There are things you need to know to use this new method. First of all that observer object is your responsibility. You have to keep a reference to it around and eventually remove it from the NSNotificationCenter by calling <code>[[NSNotificationCenter defaultCenter] removeObserver:observer];</code>. I like to have a lazily created mutable array that I use to store observers, and then I can unsubscribe from them all in one go when needed using something like this:</p>

<figure class='code'> <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="k">for</span> <span class="p">(</span><span class="kt">id</span> <span class="n">observer</span> <span class="k">in</span> <span class="n">self</span><span class="p">.</span><span class="n">observers</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="p">[[</span><span class="n">NSNotificationCenter</span> <span class="n">defaultCenter</span><span class="p">]</span> <span class="nl">removeObserver:</span><span class="n">observer</span><span class="p">];</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="n">self</span><span class="p">.</span><span class="n">observers</span> <span class="o">=</span> <span class="nb">nil</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The second caveat is down to block memory semantics. That block behaves like all others and retains everything in its scope. This means that if you rely on removing observers in the dealloc method, for example, it may never get called. It also means that, if you forget to remove the observer, whatever you reference in that block will be retained, sit there in memory and potentially execute its code in total isolation. This can cause untold trouble and hard to debug problems. The solution is to make sure that all references to self in the block are weak:</p>

<figure class='code'> <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='obj-c'><span class='line'>    <span class="n">__weak</span> <span class="n">JPCloudViewController</span> <span class="o">*</span> <span class="n">weakself</span> <span class="o">=</span> <span class="n">self</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">id</span> <span class="n">observer</span> <span class="o">=</span> <span class="p">[[</span><span class="n">NSNotificationCenter</span> <span class="n">defaultCenter</span><span class="p">]</span>
</span><span class='line'>                    <span class="nl">addObserverForName:</span><span class="n">UIApplicationDidEnterBackgroundNotification</span>
</span><span class='line'>                    <span class="nl">object:</span><span class="nb">nil</span>
</span><span class='line'>                    <span class="nl">queue:</span><span class="p">[</span><span class="n">NSOperationQueue</span> <span class="n">mainQueue</span><span class="p">]</span>
</span><span class='line'>                    <span class="nl">usingBlock:</span><span class="o">^</span><span class="p">(</span><span class="n">NSNotification</span> <span class="o">*</span><span class="n">note</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                        <span class="n">weakself</span><span class="p">.</span><span class="n">cloudContainerView</span><span class="p">.</span><span class="n">alpha</span> <span class="o">=</span> <span class="mf">0.0</span><span class="p">;</span>
</span><span class='line'>                    <span class="p">}];</span>
</span><span class='line'>    <span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">observers</span> <span class="nl">addObject:</span><span class="n">observer</span><span class="p">];</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now if the notification is fired and your object is released all the references to self will be nil and nothing will happen. No crashes or anything.</p>

<h2>So why is it better?</h2>

<p>Finally heres why I think the new syntax is better. Firstly programmer error will not cause a crash for users. Arguably it would be better to know about programmer error but I think an a memory leak is a better experience than a crash for the end user. If you wanted you could even put an <code>NSAssert</code> in the block to throw if weakself is nil. Assert macros are off by default for release builds so you can get the best of both worlds. Another benefit is you define the code to execute where you listen for the notificaion. The Xcode refactor tools work properly with the code in the block. The Callers list also shows correctly for functions called from the block. Code is guaranteed to run on the queue you specify, unlike the older style of notificaion where your code would run on the same thread that posted the notification. I also like the way blocks can be offloaded to background threads with ease.</p>

<p>Its good to try new things so give the new Notification syntax a try today!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Background core data with privateQueueContext]]></title>
    <link href="http://joelparsons.github.io/blog/2013/09/02/background-core-data-with-privatequeuecontext/"/>
    <updated>2013-09-02T09:00:00+01:00</updated>
    <id>http://joelparsons.github.io/blog/2013/09/02/background-core-data-with-privatequeuecontext</id>
    <content type="html"><![CDATA[<p>Working with core data on multiple threads can be challenging, as can working across multiple threads in general, but the privateQueueContext method hasn&rsquo;t been as talked about as some of the other methods.</p>

<h2>privateQueueContext</h2>

<p>The old model with <code>NSManagedObjectContext</code> was that you had to create a context on every thread you were going to access core data on. When this context was saved it would write back to the persistent store and notifications would fire that would allow you to update your other contexts on other threads.</p>

<!-- MORE -->


<p>The new model changes all this and makes working with core data on other threads easy. In fact instead of thinking in threads its better to think of everything in Queues (<a href="https://www.google.co.uk/search?q=grand+central+dispatch">its based on GCD</a>. You create a context for working on the main queue with like you normally would but you use the following new method:</p>

<figure class='code'> <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='obj-c'><span class='line'><span class="n">NSManagedObjectContext</span> <span class="o">*</span> <span class="n">mainQueueContext</span> <span class="o">=</span> <span class="p">[[</span><span class="n">NSManagedObjectContext</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithConcurrencyType:</span><span class="n">NSMainQueueConcurrencyType</span><span class="p">];</span>
</span></code></pre></td></tr></table></div></figure>


<p>There are many methods you can use to share this context among your view controllers like pass the baton, using the app delegate or a shared instance of your store object in a <a href="http://programmers.stackexchange.com/questions/184396/mvcs-model-view-controller-store">model-view-controller-store</a> style project. Whats best is really a personal choice.</p>

<p>But the exciting part is how you work with core data in the background. Create a context with the private queue concurrency type like so:</p>

<figure class='code'> <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='obj-c'><span class='line'><span class="n">NSManagedObjectContext</span> <span class="o">*</span> <span class="n">priveteQueueContext</span> <span class="o">=</span> <span class="p">[[</span><span class="n">NSManagedObjectContext</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithConcurrencyType:</span><span class="n">NSPrivateQueueConcurrencyType</span><span class="p">];</span>
</span></code></pre></td></tr></table></div></figure>


<p>I like to keep this context private within a store object, since I mostly use the background thread for data processing and most of that happens within the store or its scope. One can then submit work to be done asyncronously in the background like so:</p>

<figure class='code'> <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='obj-c'><span class='line'><span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">privateQueueContext</span> <span class="nl">performBlock:</span><span class="o">^</span><span class="p">{</span>
</span><span class='line'>        <span class="n">Magazine</span> <span class="o">*</span> <span class="n">magazine</span> <span class="o">=</span> <span class="p">(</span><span class="n">Magazine</span> <span class="o">*</span><span class="p">)</span> <span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">privateQueueContext</span> <span class="nl">objectWithID:</span><span class="n">magazineObjectID</span><span class="p">];</span>
</span><span class='line'>        <span class="n">magazine</span><span class="p">.</span><span class="n">headerImage</span> <span class="o">=</span> <span class="n">image</span><span class="p">;</span>
</span><span class='line'>        <span class="n">NSError</span> <span class="o">*</span> <span class="n">error</span><span class="p">;</span>
</span><span class='line'>        <span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">privateQueueContext</span> <span class="nl">save:</span><span class="o">&amp;</span><span class="n">error</span><span class="p">];</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="c1">//handle error</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>


<h2>Queueing things up</h2>

<p>Queues can give you some quite complex behaviour. Say you want to add a bunch of objects to Core Data and then save at the end. You send off several worker blocks, one to add each item, and then add block at the end that saves all the objects. No need to keep track of state or figure out when you are on the last object.</p>

<p>You can import a bunch of objects into core data, and then add a block at the end which works with all the objects you just added. This can be really helpful for importing objects and then adding relationships between them once they are all imported.</p>

<h2>Syncing across</h2>

<p>The only issue is syncing your changes made in the background to your foreground context. Listening to the notificaiton is fairly simple:</p>

<figure class='code'> <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='obj-c'><span class='line'><span class="kt">id</span> <span class="n">observer</span> <span class="o">=</span> <span class="p">[[</span><span class="n">NSNotificationCenter</span> <span class="n">defaultCenter</span><span class="p">]</span>
</span><span class='line'>                   <span class="nl">addObserverForName:</span><span class="n">NSManagedObjectContextDidSaveNotification</span>
</span><span class='line'>                   <span class="nl">object:</span><span class="n">self</span><span class="p">.</span><span class="n">privateQueueContext</span>
</span><span class='line'>                   <span class="nl">queue:</span><span class="p">[</span><span class="n">NSOperationQueue</span> <span class="n">mainQueue</span><span class="p">]</span>
</span><span class='line'>                   <span class="nl">usingBlock:</span><span class="o">^</span><span class="p">(</span><span class="n">NSNotification</span> <span class="o">*</span><span class="n">note</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                       <span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">mainQueueContext</span> <span class="nl">mergeChangesFromContextDidSaveNotification:</span><span class="n">note</span><span class="p">];</span>
</span><span class='line'>                   <span class="p">}];</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Code Runner]]></title>
    <link href="http://joelparsons.github.io/blog/2013/08/26/code-runner/"/>
    <updated>2013-08-26T14:35:00+01:00</updated>
    <id>http://joelparsons.github.io/blog/2013/08/26/code-runner</id>
    <content type="html"><![CDATA[<p><a href="http://krillapps.com/coderunner/">Code runner</a> (also available in the <a href="http://itunes.apple.com/us/app/coderunner/id433335799?mt=12">Mac App Store</a>) is a fantastic app that should be in every iOS and Mac developer&rsquo;s toolkit.</p>

<p>If you are ever in the middle of a project and want to write a quick snippet to determine if an API is going to respond the way you think it will then Code Runner can help you out. Quite simply it sets up an environment where you can just start typing in your language of choice and, when you&rsquo;re ready to test, has a giant play button similar to Xcode that will run your code.</p>

<!-- MORE -->


<p>Heres an example from the other day. I wanted to do a check on the iOS system version for a very particular edge case and I was browsing through all the terrible and overly complicated comparison functions proffered in <a href="http://stackoverflow.com/questions/3339722/check-iphone-ios-version">this Stack Overflow Question</a> and came across the option of using the built in <code>NSNumericSearch</code> option for <code>compare:options:</code>. I wanted to verify this method would work correctly with different version numbers so I fired up code runner and tried out this small programme with a few different version numbers</p>

<figure class='code'> <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>
</pre></td><td class='code'><pre><code class='obj-c'><span class='line'><span class="cp">#import &lt;Foundation/Foundation.h&gt;</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="err">@</span><span class="n">autoreleasepool</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">NSString</span> <span class="o">*</span> <span class="n">version1</span> <span class="o">=</span> <span class="s">@&quot;1.9.1&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="n">NSString</span> <span class="o">*</span> <span class="n">version2</span> <span class="o">=</span> <span class="s">@&quot;1.100.1&quot;</span><span class="p">;</span>
</span><span class='line'>
</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">version1</span> <span class="nl">compare:</span><span class="n">version2</span> <span class="nl">options:</span><span class="n">NSNumericSearch</span><span class="p">];</span>
</span><span class='line'>
</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">NSOrderedAscending</span><span class="p">){</span>
</span><span class='line'>            <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;Ascending&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="k">else</span> <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><span class='line'>            <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;Same&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="k">else</span><span class="p">{</span>
</span><span class='line'>            <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;Decending&quot;</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="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Very quickly I had determined that the option worked as advertised and was able to include it in my code with the relevant test cases.</p>

<h2>Debugging</h2>

<p>If you make a typo in Code Runner it can be hard to debug as you dont necessarily get a stack trace or other information on code crash. Luckily Code Runner has the option to add custom running environments to its editor and by duplicating and slightly tweaking the existing objective-c template I was able to make it run the code in the lldb debugger.</p>

<p><img src="http://joelparsons.github.io/images/lldb.jpg" title="" alt="configuration for running with the lldb debugger" /></p>

<p>When you click the play button it fires up lldb and will load your executable. To run you can type r and hit return. You can also use all the other lldb commands you would expect like add breakpoints and inspect variables at runtime. Its not as nice as the interface in Xcode but the liklihood is that the issues you will encounter wont be as hard to debug!</p>

<h2>Classes, Protocols, Categories and more</h2>

<p>I&rsquo;m not sure its widely known that we keep our classes in separate files out of convention rather than necessity but with this knowledge your use of Code Runner can become quite advanced indeed. It can be used to prototype classes and methods on those classes that can quickly be integrated into a larger application. It can even be handy if practising computer science style challenges.</p>

<p>Heres an example where I was practising determining if a string was a permutation of another string. This is more of a trick question as once you realise that all permutations of any particular string are contained in a doubled version of that string the implementation is straightforward. Here I&rsquo;ve implemented the check in code runner but as a category method on <code>NSString</code></p>

<figure class='code'> <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;Foundation/Foundation.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@interface</span> <span class="nc">NSString</span> <span class="nl">(permutation)</span>
</span><span class='line'><span class="k">-</span><span class="p">(</span><span class="kt">BOOL</span><span class="p">)</span><span class="nf">isPermutationOfString:</span><span class="p">(</span><span class="n">NSString</span> <span class="err">\</span><span class="o">*</span><span class="p">)</span><span class="nv">string</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">NSString</span> <span class="nl">(permutation)</span>
</span><span class='line'><span class="k">-</span><span class="p">(</span><span class="kt">BOOL</span><span class="p">)</span><span class="nf">isPermutationOfString:</span><span class="p">(</span><span class="n">NSString</span> <span class="err">\</span><span class="o">*</span><span class="p">)</span><span class="nv">string</span><span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">NSString</span> <span class="o">*</span> <span class="n">doubleSelf</span> <span class="o">=</span> <span class="p">[</span><span class="n">self</span> <span class="nl">stringByAppendingString:</span><span class="n">self</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">NSRange</span> <span class="n">range</span> <span class="o">=</span> <span class="p">[</span><span class="n">doubleSelf</span> <span class="nl">rangeOfString:</span><span class="n">string</span><span class="p">];</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">range</span><span class="p">.</span><span class="n">location</span> <span class="o">==</span> <span class="n">NSNotFound</span><span class="p">)</span> <span class="k">return</span> <span class="n">NO</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="n">YES</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">@end</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="err">\</span><span class="o">*</span><span class="n">argv</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">NSString</span> <span class="o">*</span> <span class="n">permutation</span> <span class="o">=</span> <span class="s">@&quot;elloh&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="n">NSString</span> <span class="o">*</span> <span class="n">test</span> <span class="o">=</span> <span class="s">@&quot;hello&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;%@&quot;</span><span class="p">,[</span><span class="n">permutation</span> <span class="nl">isPermutationOfString:</span><span class="n">test</span><span class="p">]</span> <span class="o">?</span> <span class="s">@&quot;YES&quot;</span> <span class="o">:</span> <span class="s">@&quot;NO&quot;</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>So I reccommend you check out Code Runner. Its well worth the money and it can save you time with your development.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The Boggle Board Question]]></title>
    <link href="http://joelparsons.github.io/blog/2013/06/25/the-boggle-board/"/>
    <updated>2013-06-25T14:12:00+01:00</updated>
    <id>http://joelparsons.github.io/blog/2013/06/25/the-boggle-board</id>
    <content type="html"><![CDATA[<p>So I was looking into the &ldquo;Boggle Board&rdquo; question which is posted on several programming interview sites. The question is pretty straight forward even if you dont know the game &ldquo;boggle&rdquo; which it is based on. You have a nxm matrix of letters and the aim of the game is to make words from those letters. From any arbitraty starting letter you are allowed to travel from letter to letter in any direction including diagonals with the restriction that you cant use the same letter twice.</p>

<!-- MORE -->


<p>The interview quetion usually asks candidates to to determine, given a 4x4 boggle board, whether a given word is in the board.</p>

<p>The problem seems deceptively simple but the requirement that you mustnt revisit a letter means that any kind of recursive solution is going to have to keep track of a whole bunch of state and get messy really quickly.</p>

<h2>Graph Search</h2>

<p>The simplicity of a graph search based solution becomes apparent if you solve the meaty part of the problem first.</p>

<p>To solve this problem with a graph search algorithm we need the letters in a graph. Lets create a node object that we can build a graph out of:</p>

<figure class='code'> <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">Node</span> : <span class="nc">NSObject</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">NSString</span> <span class="o">*</span> <span class="n">letter</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">NSMutableSet</span> <span class="o">*</span> <span class="n">adjacentNodes</span><span class="p">;</span>
</span><span class='line'><span class="k">@end</span>
</span></code></pre></td></tr></table></div></figure>


<p>We would create a <code>Node \*</code> for each letter in the boggle board and then link it to the nodes that letter is adjacent to. There is now no need to store the Nodes in an array matrix that represents the board or anything like that as all the information about the board we need is encapsulated in these two pieces of data. Now assuming we can get the board represented in a bunch of <code>Node</code> objects all in an <code>NSSet</code> the algorithm for searching through them is relatively simple.</p>

<p>We take each <code>Node</code> in turn and do a depth first search on its neighbours for a match for the next letter in the word we are checking for.</p>

<figure class='code'> <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='objc'><span class='line'><span class="kt">BOOL</span> <span class="nf">searchForWord</span><span class="p">((</span><span class="n">NSString</span> <span class="err">\</span><span class="o">*</span><span class="p">)</span><span class="n">word</span><span class="p">,</span> <span class="n">NSSet</span> <span class="o">*</span> <span class="n">nodeGraph</span><span class="p">){</span>
</span><span class='line'>    <span class="n">NSString</span> <span class="o">*</span> <span class="n">firstLetter</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSString</span> <span class="nl">stringWithFormat:</span><span class="s">@&quot;%c&quot;</span><span class="p">,[</span><span class="n">word</span> <span class="nl">characterAtIndex:</span><span class="mi">0</span><span class="p">]];</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="n">Node</span> <span class="o">*</span> <span class="n">node</span> <span class="k">in</span> <span class="n">nodeGraph</span><span class="p">){</span>
</span><span class='line'>        <span class="n">NSMutableSet</span> <span class="o">*</span> <span class="n">visitedNodes</span> <span class="o">=</span> <span class="p">[[</span><span class="n">NSMutableSet</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithCapacity:</span><span class="n">word</span><span class="p">.</span><span class="n">length</span><span class="p">];</span>
</span><span class='line'>        <span class="kt">BOOL</span> <span class="n">found</span> <span class="o">=</span> <span class="n">depthFirstSearch</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">word</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">visitedNodes</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">found</span><span class="p">)</span> <span class="k">return</span> <span class="n">found</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">NO</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>For the <code>depthFirstSearch</code> function we need to do a few things.
1. Keep track of visited Nodes so we don&rsquo;t visit the same one twice
2. Keep track of depth so we know our position in the word
3. Recursively search through the adjacent nodes</p>

<figure class='code'> <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>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="kt">BOOL</span> <span class="nf">depthFirstSearch</span><span class="p">(</span><span class="n">Node</span> <span class="o">*</span> <span class="n">node</span><span class="p">,</span> <span class="n">NSString</span> <span class="o">*</span> <span class="n">word</span><span class="p">,</span> <span class="n">NSInteger</span> <span class="n">depth</span><span class="p">,</span> <span class="n">NSMutableSet</span> <span class="o">*</span> <span class="n">visitedNodes</span><span class="p">){</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">unichar</span> <span class="n">nodeLetter</span> <span class="o">=</span> <span class="p">[</span><span class="n">node</span><span class="p">.</span><span class="n">letter</span> <span class="nl">characterAtIndex:</span><span class="mi">0</span><span class="p">];</span>
</span><span class='line'>    <span class="n">unichar</span> <span class="n">wordLetter</span> <span class="o">=</span> <span class="p">[</span><span class="n">word</span> <span class="nl">characterAtIndex:</span><span class="n">depth</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">[</span><span class="n">visitedNodes</span> <span class="nl">addObject:</span><span class="n">node</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">nodeLetter</span> <span class="o">==</span> <span class="n">wordLetter</span><span class="p">){</span>
</span><span class='line'>        <span class="c1">//if we have a match and have letters left keep searching</span>
</span><span class='line'>        <span class="c1">//else we are at the end of the word so return YES</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">depth</span> <span class="o">&lt;</span> <span class="n">word</span><span class="p">.</span><span class="n">length</span> <span class="o">-</span> <span class="mi">1</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">Node</span> <span class="o">*</span> <span class="n">adjacentNode</span> <span class="k">in</span> <span class="n">node</span><span class="p">.</span><span class="n">adjacentNodes</span><span class="p">){</span>
</span><span class='line'>                <span class="k">if</span> <span class="p">([</span><span class="n">visitedNodes</span> <span class="nl">containsObject:</span><span class="n">adjacentNode</span><span class="p">])</span> <span class="k">continue</span><span class="p">;</span>
</span><span class='line'>                <span class="kt">BOOL</span> <span class="n">found</span> <span class="o">=</span> <span class="n">depthFirstSearch</span><span class="p">(</span><span class="n">adjacentNode</span><span class="p">,</span> <span class="n">word</span><span class="p">,</span> <span class="n">depth</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">visitedNodes</span><span class="p">);</span>
</span><span class='line'>                <span class="k">if</span> <span class="p">(</span><span class="n">found</span><span class="p">)</span> <span class="k">return</span> <span class="n">found</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">else</span> <span class="k">return</span> <span class="n">YES</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">[</span><span class="n">visitedNodes</span> <span class="nl">removeObject:</span><span class="n">node</span><span class="p">];</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">NO</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And thats it. Two simple functions achieve the objectives of the questions in 30 lines of code. For some interviewers this may be enough as this is considered to be the hard part of the question.</p>

<h2>Going Further</h2>

<p>There are several directions you could take this to make it more fully formed. For example, given a matrix of arrays could we build the graph? Also if were keeping the graph around it might make sense to make a graph object and make the search a method on a graph instance along with a graph generation method on the class. Ive tied it all together in a excerpt you can actually paste and run into an xcode command line app.</p>

<figure class='code'><figcaption><span>main.m </span><a href='https://gist.github.com/joelparsons/5666671'>Github Gist </a></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>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<span class='line-number'>113</span>
<span class='line-number'>114</span>
<span class='line-number'>115</span>
<span class='line-number'>116</span>
<span class='line-number'>117</span>
<span class='line-number'>118</span>
<span class='line-number'>119</span>
<span class='line-number'>120</span>
<span class='line-number'>121</span>
<span class='line-number'>122</span>
<span class='line-number'>123</span>
<span class='line-number'>124</span>
<span class='line-number'>125</span>
<span class='line-number'>126</span>
<span class='line-number'>127</span>
<span class='line-number'>128</span>
<span class='line-number'>129</span>
<span class='line-number'>130</span>
<span class='line-number'>131</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="cp">#import &lt;Foundation/Foundation.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@interface</span> <span class="nc">Node</span> : <span class="nc">NSObject</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">NSString</span> <span class="o">*</span> <span class="n">letter</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">NSMutableSet</span> <span class="o">*</span> <span class="n">adjacentNodes</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">Node</span>
</span><span class='line'><span class="k">-</span><span class="p">(</span><span class="n">NSMutableSet</span> <span class="o">*</span><span class="p">)</span><span class="nf">adjacentNodes</span><span class="p">{</span>
</span><span class='line'>    <span class="k">if</span><span class="p">(</span><span class="n">_adjacentNodes</span><span class="p">){</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">_adjacentNodes</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="n">_adjacentNodes</span> <span class="o">=</span> <span class="p">[[</span><span class="n">NSMutableSet</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="k">return</span> <span class="n">_adjacentNodes</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="k">@end</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">@interface</span> <span class="nc">Graph</span> : <span class="nc">NSObject</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">NSSet</span> <span class="o">*</span> <span class="n">nodes</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">NSDictionary</span> <span class="o">*</span> <span class="n">lookupDictionary</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">+</span><span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">graphForBoggleBoard:</span><span class="p">(</span><span class="n">NSArray</span> <span class="o">*</span><span class="p">)</span><span class="nv">board</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">-</span><span class="p">(</span><span class="kt">BOOL</span><span class="p">)</span><span class="nf">searchForWord:</span><span class="p">(</span><span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">word</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">Graph</span>
</span><span class='line'>
</span><span class='line'><span class="k">+</span><span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">graphForBoggleBoard:</span><span class="p">(</span><span class="n">NSArray</span> <span class="o">*</span><span class="p">)</span><span class="nv">board</span><span class="p">{</span>
</span><span class='line'>    <span class="n">NSMutableSet</span> <span class="o">*</span> <span class="n">nodes</span> <span class="o">=</span> <span class="p">[[</span><span class="n">NSMutableSet</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">NSMutableDictionary</span> <span class="o">*</span> <span class="n">dictionary</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSMutableDictionary</span> <span class="n">dictionary</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">NSMutableArray</span> <span class="o">*</span> <span class="n">nodeBoard</span> <span class="o">=</span> <span class="p">[[</span><span class="n">NSMutableArray</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithCapacity:</span><span class="n">board</span><span class="p">.</span><span class="n">count</span><span class="p">];</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="n">NSArray</span> <span class="o">*</span> <span class="n">row</span> <span class="k">in</span> <span class="n">board</span><span class="p">){</span>
</span><span class='line'>        <span class="n">NSMutableArray</span> <span class="o">*</span> <span class="n">nodeRow</span> <span class="o">=</span> <span class="p">[[</span><span class="n">NSMutableArray</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithCapacity:</span><span class="n">row</span><span class="p">.</span><span class="n">count</span><span class="p">];</span>
</span><span class='line'>        <span class="k">for</span> <span class="p">(</span><span class="n">NSString</span> <span class="o">*</span> <span class="n">letter</span> <span class="k">in</span> <span class="n">row</span><span class="p">){</span>
</span><span class='line'>            <span class="n">Node</span> <span class="o">*</span> <span class="n">node</span> <span class="o">=</span> <span class="p">[[</span><span class="n">Node</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">node</span><span class="p">.</span><span class="n">letter</span> <span class="o">=</span> <span class="n">letter</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>            <span class="p">[</span><span class="n">nodeRow</span> <span class="nl">addObject:</span><span class="n">node</span><span class="p">];</span>
</span><span class='line'>            <span class="p">[</span><span class="n">nodes</span> <span class="nl">addObject:</span><span class="n">node</span><span class="p">];</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="n">dictionary</span><span class="p">[</span><span class="n">node</span><span class="p">.</span><span class="n">letter</span><span class="p">]){</span>
</span><span class='line'>                <span class="p">[</span><span class="n">dictionary</span><span class="p">[</span><span class="n">node</span><span class="p">.</span><span class="n">letter</span><span class="p">]</span> <span class="nl">addObject:</span><span class="n">node</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="n">dictionary</span><span class="p">[</span><span class="n">node</span><span class="p">.</span><span class="n">letter</span><span class="p">]</span> <span class="o">=</span> <span class="err">@</span><span class="p">[</span><span class="n">node</span><span class="p">].</span><span class="n">mutableCopy</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="p">[</span><span class="n">nodeBoard</span> <span class="nl">addObject:</span><span class="n">nodeRow</span><span class="p">];</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>    <span class="n">NSArray</span> <span class="o">*</span> <span class="n">previousRow</span> <span class="o">=</span> <span class="nb">nil</span><span class="p">;</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="n">NSInteger</span> <span class="n">row</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">row</span> <span class="o">&lt;</span> <span class="n">nodeBoard</span><span class="p">.</span><span class="n">count</span><span class="p">;</span> <span class="n">row</span><span class="o">++</span><span class="p">){</span>
</span><span class='line'>        <span class="n">NSArray</span> <span class="o">*</span> <span class="n">nodeRow</span> <span class="o">=</span> <span class="n">nodeBoard</span><span class="p">[</span><span class="n">row</span><span class="p">];</span>
</span><span class='line'>        <span class="k">for</span> <span class="p">(</span><span class="n">NSInteger</span> <span class="n">col</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">col</span> <span class="o">&lt;</span> <span class="n">nodeRow</span><span class="p">.</span><span class="n">count</span><span class="p">;</span> <span class="n">col</span> <span class="o">++</span><span class="p">){</span>
</span><span class='line'>            <span class="n">Node</span> <span class="o">*</span> <span class="n">currentNode</span> <span class="o">=</span> <span class="n">nodeBoard</span><span class="p">[</span><span class="n">row</span><span class="p">][</span><span class="n">col</span><span class="p">];</span>
</span><span class='line'>            <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">col</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">col</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
</span><span class='line'>                <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="o">||</span> <span class="n">i</span> <span class="o">&gt;=</span> <span class="n">nodeRow</span><span class="p">.</span><span class="n">count</span><span class="p">)</span>
</span><span class='line'>                    <span class="k">continue</span><span class="p">;</span>
</span><span class='line'>                <span class="n">Node</span> <span class="o">*</span> <span class="n">node</span> <span class="o">=</span> <span class="n">previousRow</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span><span class='line'>                <span class="k">if</span> <span class="p">(</span><span class="n">node</span><span class="p">){</span>
</span><span class='line'>                    <span class="p">[</span><span class="n">currentNode</span><span class="p">.</span><span class="n">adjacentNodes</span> <span class="nl">addObject:</span><span class="n">node</span><span class="p">];</span>
</span><span class='line'>                    <span class="p">[</span><span class="n">node</span><span class="p">.</span><span class="n">adjacentNodes</span> <span class="nl">addObject:</span><span class="n">currentNode</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">if</span> <span class="p">(</span><span class="n">col</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">){</span>
</span><span class='line'>                <span class="n">Node</span> <span class="o">*</span> <span class="n">node</span> <span class="o">=</span> <span class="n">nodeBoard</span><span class="p">[</span><span class="n">row</span><span class="p">][</span><span class="n">col</span> <span class="o">-</span> <span class="mi">1</span><span class="p">];</span>
</span><span class='line'>                <span class="p">[</span><span class="n">currentNode</span><span class="p">.</span><span class="n">adjacentNodes</span> <span class="nl">addObject:</span><span class="n">node</span><span class="p">];</span>
</span><span class='line'>                <span class="p">[</span><span class="n">node</span><span class="p">.</span><span class="n">adjacentNodes</span> <span class="nl">addObject:</span><span class="n">currentNode</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="n">previousRow</span> <span class="o">=</span> <span class="n">nodeRow</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>    <span class="n">Graph</span> <span class="o">*</span> <span class="n">graph</span> <span class="o">=</span> <span class="p">[[</span><span class="n">Graph</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">graph</span><span class="p">.</span><span class="n">lookupDictionary</span> <span class="o">=</span> <span class="n">dictionary</span><span class="p">;</span>
</span><span class='line'>    <span class="n">graph</span><span class="p">.</span><span class="n">nodes</span> <span class="o">=</span> <span class="n">nodes</span><span class="p">;</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">graph</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">BOOL</span> <span class="nf">depthFirstSearch</span><span class="p">(</span><span class="n">Node</span> <span class="o">*</span> <span class="n">node</span><span class="p">,</span> <span class="n">NSString</span> <span class="o">*</span> <span class="n">word</span><span class="p">,</span> <span class="n">NSInteger</span> <span class="n">depth</span><span class="p">,</span> <span class="n">NSMutableSet</span> <span class="o">*</span> <span class="n">visitedNodes</span><span class="p">){</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">unichar</span> <span class="n">nodeLetter</span> <span class="o">=</span> <span class="p">[</span><span class="n">node</span><span class="p">.</span><span class="n">letter</span> <span class="nl">characterAtIndex:</span><span class="mi">0</span><span class="p">];</span>
</span><span class='line'>    <span class="n">unichar</span> <span class="n">wordLetter</span> <span class="o">=</span> <span class="p">[</span><span class="n">word</span> <span class="nl">characterAtIndex:</span><span class="n">depth</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">[</span><span class="n">visitedNodes</span> <span class="nl">addObject:</span><span class="n">node</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">nodeLetter</span> <span class="o">==</span> <span class="n">wordLetter</span><span class="p">){</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">depth</span> <span class="o">&lt;</span> <span class="n">word</span><span class="p">.</span><span class="n">length</span> <span class="o">-</span> <span class="mi">1</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">Node</span> <span class="o">*</span> <span class="n">adjacentNode</span> <span class="k">in</span> <span class="n">node</span><span class="p">.</span><span class="n">adjacentNodes</span><span class="p">){</span>
</span><span class='line'>                <span class="k">if</span> <span class="p">([</span><span class="n">visitedNodes</span> <span class="nl">containsObject:</span><span class="n">adjacentNode</span><span class="p">])</span> <span class="k">continue</span><span class="p">;</span>
</span><span class='line'>                <span class="kt">BOOL</span> <span class="n">found</span> <span class="o">=</span> <span class="n">depthFirstSearch</span><span class="p">(</span><span class="n">adjacentNode</span><span class="p">,</span> <span class="n">word</span><span class="p">,</span> <span class="n">depth</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">visitedNodes</span><span class="p">);</span>
</span><span class='line'>                <span class="k">if</span> <span class="p">(</span><span class="n">found</span><span class="p">)</span> <span class="k">return</span> <span class="n">found</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">else</span> <span class="k">return</span> <span class="n">YES</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">[</span><span class="n">visitedNodes</span> <span class="nl">removeObject:</span><span class="n">node</span><span class="p">];</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">NO</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">BOOL</span><span class="p">)</span><span class="nf">searchForWord:</span><span class="p">(</span><span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">word</span><span class="p">{</span>
</span><span class='line'>    <span class="n">NSString</span> <span class="o">*</span> <span class="n">firstLetter</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSString</span> <span class="nl">stringWithFormat:</span><span class="s">@&quot;%c&quot;</span><span class="p">,[</span><span class="n">word</span> <span class="nl">characterAtIndex:</span><span class="mi">0</span><span class="p">]];</span>
</span><span class='line'>    <span class="n">NSSet</span> <span class="o">*</span> <span class="n">firstNodes</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">lookupDictionary</span><span class="p">[</span><span class="n">firstLetter</span><span class="p">];</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="n">Node</span> <span class="o">*</span> <span class="n">node</span> <span class="k">in</span> <span class="n">firstNodes</span><span class="p">){</span>
</span><span class='line'>        <span class="n">NSMutableSet</span> <span class="o">*</span> <span class="n">visitedNodes</span> <span class="o">=</span> <span class="p">[[</span><span class="n">NSMutableSet</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithCapacity:</span><span class="n">word</span><span class="p">.</span><span class="n">length</span><span class="p">];</span>
</span><span class='line'>        <span class="kt">BOOL</span> <span class="n">found</span> <span class="o">=</span> <span class="n">depthFirstSearch</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">word</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">visitedNodes</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">found</span><span class="p">)</span> <span class="k">return</span> <span class="n">found</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">NO</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="k">@end</span>
</span><span class='line'>
</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="err">@</span><span class="n">autoreleasepool</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">NSArray</span> <span class="o">*</span> <span class="n">boggleBoard</span> <span class="o">=</span> <span class="err">@</span><span class="p">[</span>
</span><span class='line'>                                  <span class="err">@</span><span class="p">[</span><span class="s">@&quot;a&quot;</span><span class="p">,</span> <span class="s">@&quot;b&quot;</span><span class="p">,</span> <span class="s">@&quot;c&quot;</span><span class="p">],</span>
</span><span class='line'>                                  <span class="err">@</span><span class="p">[</span><span class="s">@&quot;d&quot;</span><span class="p">,</span> <span class="s">@&quot;d&quot;</span><span class="p">,</span> <span class="s">@&quot;h&quot;</span><span class="p">],</span>
</span><span class='line'>                                  <span class="err">@</span><span class="p">[</span><span class="s">@&quot;e&quot;</span><span class="p">,</span> <span class="s">@&quot;i&quot;</span><span class="p">,</span> <span class="s">@&quot;u&quot;</span><span class="p">]</span>
</span><span class='line'>                                  <span class="p">];</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">Graph</span> <span class="o">*</span> <span class="n">graph</span> <span class="o">=</span> <span class="p">[</span><span class="n">Graph</span> <span class="nl">graphForBoggleBoard:</span><span class="n">boggleBoard</span><span class="p">];</span>
</span><span class='line'>        <span class="n">NSLog</span> <span class="p">(</span><span class="s">@&quot;Word %@&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">graph</span> <span class="nl">searchForWord:</span><span class="s">@&quot;chuddd&quot;</span><span class="p">]</span> <span class="o">?</span> <span class="s">@&quot;exists&quot;</span> <span class="o">:</span> <span class="s">@&quot;doesnt exist&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>



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