<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" version="2.0">
  <channel>
    <title>Tom Dalling</title>
    <link>https://www.tomdalling.com/?utm_source=rss&amp;utm_medium=rss</link>
    <atom:link href="https://www.tomdalling.com/blog/tagged/coding-tips/feed/" rel="self" type="application/rss+xml"/>
    <description>Web &amp; software developer</description>
    <language>en</language>
    <generator>Tom Dalling's fingertips</generator>
    <sy:updatePeriod>daily</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>When A Café Is Not A Café – A Short Lesson In Unicode Featuring NSString</title>
      <link>https://www.tomdalling.com/blog/when-a-cafe-is-not-a-cafe-a-short-lesson-in-unicode-featuring-nsstring/?utm_source=rss&amp;utm_medium=rss</link>
      <description><![CDATA[<p>Let’s start with two exotic strings (console output is in the code comments):</p>

<div class="language-objc highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">NSString</span><span class="o">*</span> <span class="n">apples</span> <span class="o">=</span> <span class="n">NSGetFrenchWord</span><span class="p">();</span>
<span class="n">NSString</span><span class="o">*</span> <span class="n">oranges</span> <span class="o">=</span><span class="err"> </span><span class="n">NSGetFrenchWord</span><span class="p">();</span>

<span class="n">NSLog</span><span class="p">(</span><span class="s">@"apples == '%@'"</span><span class="p">,</span> <span class="n">apples</span><span class="p">);</span> 
<span class="c1">//apples == 'café'</span>
<span class="n">NSLog</span><span class="p">(</span><span class="s">@"oranges == '%@'"</span><span class="p">,</span> <span class="n">oranges</span><span class="p">);</span> 
<span class="c1">//oranges == 'café'</span>
</code></pre></div></div>

<p>They look identical, but looks can be deceiving.</p>

<div class="language-objc highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">NSLog</span><span class="p">(</span><span class="s">@"isEqual? %@"</span><span class="p">,</span> <span class="p">[</span><span class="n">apples</span> <span class="nf">isEqual</span><span class="p">:</span><span class="n">oranges</span><span class="p">]</span> <span class="p">?</span> <span class="s">@"YES"</span> <span class="p">:</span> <span class="s">@"NO"</span><span class="p">);</span>
<span class="c1">//isEqual? NO</span>
<span class="n">NSLog</span><span class="p">(</span><span class="s">@"[apples length] == %lu"</span><span class="p">,</span> <span class="p">[</span><span class="n">apples</span> <span class="nf">length</span><span class="p">]);</span>
<span class="c1">//[apples length] == 4</span>
<span class="n">NSLog</span><span class="p">(</span><span class="s">@"[oranges length] == %lu"</span><span class="p">,</span> <span class="p">[</span><span class="n">oranges</span> <span class="nf">length</span><span class="p">]);</span>
<span class="c1">//[oranges length] == 5</span>
</code></pre></div></div>
]]></description>
      <pubDate>Thu, 08 Mar 2012 00:00:00 -0000</pubDate>
      <category><![CDATA[Coding Tips]]></category>
      <guid isPermaLink="false">576 http://tomdalling.com/blog/?p=576</guid>
    </item>
    <item>
      <title>Const Correctness For NSString (And Pointers In General)</title>
      <link>https://www.tomdalling.com/blog/const-correctness-for-nsstring-and-pointers-in-general/?utm_source=rss&amp;utm_medium=rss</link>
      <description><![CDATA[<p>So you’re implementing a new notification and you want the name to be a
constant. Easy, right?</p>

<div class="language-objc highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">const</span> <span class="n">NSString</span><span class="o">*</span> <span class="n">VTMyNewNotification</span><span class="p">;</span>
</code></pre></div></div>

<p>If that’s how you do constants, you’re not doing it quite right. Try assign a
new value to the alleged constant and watch in horror as the compiler doesn’t
stop you.</p>

<p>This is because when you type <code>const NSString*</code>, the compiler interprets that
as <strong>a pointer to a constant <code>NSString</code></strong>. <code>NSString</code> is already an immutable
object, so making a constant <code>NSString</code> doesn’t do anything except maybe cause
some compiler errors/warnings later when you try to use it. What you’re really
after is <strong>a constant pointer to an <code>NSString</code></strong>. It’s ever so subtly
different, and written like so:</p>

<div class="language-objc highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">NSString</span><span class="o">*</span> <span class="k">const</span> <span class="n">VTMyNewNotification</span><span class="p">;</span>
</code></pre></div></div>

<p>Don’t feel bad. It’s a common mistake. I used to do it until Rob Napier
<a href="http://stackoverflow.com/questions/1937685/static-nsstring-usage-vs-inline-nsstring-constants/1937727#1937727" title="Static NSString usage vs inline NSString constants">schooled me</a>, and now I’m passin’ on the learnin’ to you.</p>
]]></description>
      <pubDate>Fri, 16 Dec 2011 00:00:00 -0000</pubDate>
      <category><![CDATA[Coding Tips]]></category>
      <guid isPermaLink="false">552 http://tomdalling.com/blog/?p=552</guid>
    </item>
    <item>
      <title>Coding Tip: Replace Complicated Conditions With Boolean Variables</title>
      <link>https://www.tomdalling.com/blog/coding-tip-replace-complicated-conditions-with-boolean-variables/?utm_source=rss&amp;utm_medium=rss</link>
      <description><![CDATA[<p>Consider the following if statement:</p>

<div class="language-objc highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span><span class="p">(</span><span class="n">dragOperation</span> <span class="o">!=</span> <span class="n">NSDragOperationCopy</span> <span class="o">&amp;&amp;</span> <span class="n">NSPointInRect</span><span class="p">(</span><span class="n">currentMouseLocation</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">bounds</span><span class="p">)){</span>
    <span class="c1">//do something</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Even though you may have worked out what the condition represents, it probably
took you a little longer than it should. It’s complicated, making it time
consuming to read, and prone to bugs upon modification. Thankfully, there is an
easy remedy:</p>
]]></description>
      <pubDate>Sat, 03 Oct 2009 00:00:00 -0000</pubDate>
      <category><![CDATA[Coding Tips]]></category>
      <guid isPermaLink="false">196 http://tomdalling.com/?p=196</guid>
    </item>
    <item>
      <title>Coding Tip: Have A Single Exit Point</title>
      <link>https://www.tomdalling.com/blog/coding-tip-have-a-single-exit-point/?utm_source=rss&amp;utm_medium=rss</link>
      <description><![CDATA[<p>Having one exit point (return) from a function is a good thing. Here is an
example of a single exit point:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">MyArray</span><span class="o">::</span><span class="n">indexOfElement</span><span class="p">(</span><span class="kt">int</span> <span class="n">elementToFind</span><span class="p">){</span>
  <span class="kt">int</span> <span class="n">foundIndex</span> <span class="o">=</span> <span class="n">ELEMENT_NOT_FOUND</span><span class="p">;</span>

  <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="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">m_numberOfElements</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">){</span>
    <span class="k">if</span><span class="p">(</span><span class="k">this</span><span class="o">-&gt;</span><span class="n">elementAtIndex</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="o">==</span> <span class="n">elementToFind</span><span class="p">){</span>
      <span class="n">foundIndex</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
      <span class="k">break</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="p">}</span>

  <span class="k">return</span> <span class="n">foundIndex</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Having multiple exit points can be bad. Here is an example of multiple exit
points:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">MyArray</span><span class="o">::</span><span class="n">indexOfElement</span><span class="p">(</span><span class="kt">int</span> <span class="n">elementToFind</span><span class="p">){</span>
  <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="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">m_numberOfElements</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">){</span>
    <span class="k">if</span><span class="p">(</span><span class="k">this</span><span class="o">-&gt;</span><span class="n">elementAtIndex</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="o">==</span> <span class="n">elementToFind</span><span class="p">){</span>
      <span class="k">return</span> <span class="n">i</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="p">}</span>

  <span class="k">return</span> <span class="n">ELEMENT_NOT_FOUND</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The main reason multiple exit points are bad is that they complicate control
flow. The more complicated the control flow is, the harder the code is to
understand. The harder the code is to understand, the greater the change of
introduction bugs whenever the code is modified.</p>
]]></description>
      <pubDate>Tue, 30 Jun 2009 00:00:00 -0000</pubDate>
      <category><![CDATA[Coding Tips]]></category>
      <guid isPermaLink="false">75 http://tomdalling.com/?p=75</guid>
    </item>
  </channel>
</rss>
