<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Paul Solt &#187; iPhone</title>
	<atom:link href="http://paulsolt.com/tag/iphone/feed/" rel="self" type="application/rss+xml" />
	<link>http://paulsolt.com</link>
	<description>Putting the Inc back in Solt since 2005.</description>
	<lastBuildDate>Fri, 03 Feb 2012 05:04:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>The Potential of Siri</title>
		<link>http://paulsolt.com/2011/10/the-potential-of-siri/</link>
		<comments>http://paulsolt.com/2011/10/the-potential-of-siri/#comments</comments>
		<pubDate>Tue, 18 Oct 2011 17:48:33 +0000</pubDate>
		<dc:creator>Paul Solt</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[computer]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[sdk]]></category>
		<category><![CDATA[siri]]></category>
		<category><![CDATA[voice control]]></category>

		<guid isPermaLink="false">http://paulsolt.com/?p=1225</guid>
		<description><![CDATA[<p>I&#8217;ve been working on iPhone development for several years and I have been very excited to see how the iPhone SDK has progressed. See my original article on how I envisioned the <a title="iPad Revolution" href="http://paulsolt.com/2010/02/ipad-revolution/" target="_blank">iPad revolutionizing the computing experience</a>. Siri takes the iPhone platform to an entirely new level. </p> <p>Feature article by MD</p> [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working on iPhone development for several years and I have been very excited to see how the iPhone SDK has progressed. See my original article on how I envisioned the <a title="iPad Revolution" href="http://paulsolt.com/2010/02/ipad-revolution/" target="_blank">iPad revolutionizing the computing experience</a>. Siri takes the iPhone platform to an entirely new level. <span id="more-1225"></span></p>
<p>Feature article by MD</p>
<p>If you&#8217;re curious as to how the potential of Siri will impact iOS App development, then look no further than the video Apple used to demonstrate the technology, despite its somewhat heavy-on-the-awesome slant. The fact of the matter is, this is voice recognition technology that&#8217;s approaching the level of sophistication you saw in Startrek Voyager as a kid, and it could do wonders for 3rd party App developers.</p>
<p>&#8220;Load Angry Birds. New game, please. Aim 45 degrees off the starboard. Lower 3 degrees. Fire. Raise 3 degrees. Fire. Down with the piggies! Fire.&#8221;</p>
<p>It sounds far fetched, but is it? Voice control to do anything from text messaging to calling, and it&#8217;s not difficult to imagine it controlling things that are not traditionally based around natural voice input. It&#8217;d also be a great idea to work in some camera/augmented reality games, as playing &#8220;I Spy&#8221; with Siri could only make the device even more intuitive, when you&#8217;re not ringing your husband, friend or <a title="O2" href="http://www.o2.co.uk/" target="_blank">O2</a> without even touching your handset.</p>
<p>An open API to Siri will help push developers in a new direction building innovative software for the iPhone 4S, given that Siri pushes the boundaries in a way that encourages people to try something new. Google Goggles was a great example of this &#8211; it took what QR codes were doing and pushed it farther than anyone had expected it to go &#8211; I certainly didn&#8217;t expect to be able to use my voice to dictate a text message, make two calls and send an email to my boss, did you?</p>
<p>The best thing about it is the potential it awards developers working with voice and hardware interaction, as unless you&#8217;re paranoid about SkyNet and HAL-9000 becoming a reality, it certainly puts a friendlier face on an already friendly looking phone. All that&#8217;s left is for us to enjoy the adventures many app programmers are embarking on with Siri, in addition to the talented invidiual who&#8217;s just ported it to the iPhone 4. Good times to come, ahead.</p>
]]></content:encoded>
			<wfw:commentRss>http://paulsolt.com/2011/10/the-potential-of-siri/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Photo Table: Sharing Photos on iPad and iPhone using Multi-touch Input</title>
		<link>http://paulsolt.com/2011/09/photo-table-sharing-photos-on-ipad-and-iphone-using-multi-touch-input/</link>
		<comments>http://paulsolt.com/2011/09/photo-table-sharing-photos-on-ipad-and-iphone-using-multi-touch-input/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 16:47:52 +0000</pubDate>
		<dc:creator>Paul Solt</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[music]]></category>
		<category><![CDATA[photo table]]></category>
		<category><![CDATA[slideshow]]></category>

		<guid isPermaLink="false">http://paulsolt.com/?p=1203</guid>
		<description><![CDATA[Photo Table has been built from the ground up to support image management using the concept of albums. We can import albums from Facebook, Flickr, and the Photo Library.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><img class="size-full wp-image-1209 alignright" title="Photo Table on iPad and iPhone" src="http://paulsolt.com/wp-content/uploads/2011/09/iPadiPhoneDuo.png" alt="Multi-touch Photo Sharing" width="278" height="392" /></p>
<p style="text-align: justify;">I&#8217;ve been busy avoiding recruiters and graduating to work on a software startup in the RIT Summer Startup Program. Over the past four months we&#8217;ve been working out of RIT&#8217;s Venture Creations at 125 Tech Park, Rochester, NY. Initially we focused on Artwork Evolution and printing integration, but have shifted directions into supporting photo sharing.</p>
<p style="text-align: justify;">Our new product is called Photo Table. It&#8217;s an app that enables sharing photos on iPad and iPhone. The uses multi-touch gestures seen first in my gesture based <a title="Wallpaper Evolution for iPhone and iPad" href="http://blog.artworkevolution.com/ios-apps/wallpaper-evolution/">Wallpaper Evolution app</a> for iPhone and iPad. The interactive Wallpaper Evolution app provided a mechanism to add one photo to the table at a time, but it lacked depth without photo album management. That changes with Photo Table.</p>
<p style="text-align: justify;">Photo Table has been built from the ground up to support image management using the concept of albums. We can import albums from Facebook, Flickr, and the Photo Library. Any image can be added to an album or removed just like you&#8217;d expect. Once you have albums you can open them and show family and friends interactive slideshows. All the photos are stored in the app, so we support offline content viewing. We have a lot of fun with the App and are hoping that you&#8217;ll be excited to try it.</p>
<ul style="text-align: justify;">
<li><strong>Website</strong>: <a title="Multi-touch photo sharing app for iPad" href="http://www.PhotoTableApp.com/">http://www.PhotoTableApp.com/</a></li>
<li><strong>Twitter</strong>: <a title="Photo Table on Twitter" href="http://www.twitter.com/PhotoTable">@PhotoTable</a></li>
<li><strong>Facebook</strong>: <a title="Photo Table on Facebook" href="http://www.Facebook.com/PhotoTableApp/">http://www.Facebook.com/PhotoTableApp/</a></li>
</ul>
<h3 style="text-align: justify;"><a title="Download Facebook albums for off-line viewing" href="http://www.youtube.com/watch?v=7dPguidC6Mk ">Photo Table Facebook Album Importing</a></h3>
<p style="text-align: justify;">
<p><a href="http://www.youtube.com/watch?v=7dPguidC6Mk&#038;fmt=18">http://www.youtube.com/watch?v=7dPguidC6Mk</a></p>
</p>
<h3 style="text-align: justify;"><a title="Play Music with Photo Albums and Share with Family" href="http://www.youtube.com/watch?v=fpge8z65wH4 ">Add Music to Photo Albums for Sharing with Families</a></h3>
<p style="text-align: justify;">
<p><a href="http://www.youtube.com/watch?v=fpge8z65wH4&#038;fmt=18">http://www.youtube.com/watch?v=fpge8z65wH4</a></p></p>
]]></content:encoded>
			<wfw:commentRss>http://paulsolt.com/2011/09/photo-table-sharing-photos-on-ipad-and-iphone-using-multi-touch-input/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Idea to App Store &#8211; How to make, market, and sell your iPhone App</title>
		<link>http://paulsolt.com/2011/08/idea-to-app-store-how-to-make-market-and-sell-your-iphone-app/</link>
		<comments>http://paulsolt.com/2011/08/idea-to-app-store-how-to-make-market-and-sell-your-iphone-app/#comments</comments>
		<pubDate>Tue, 23 Aug 2011 18:53:27 +0000</pubDate>
		<dc:creator>Paul Solt</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[appfigures]]></category>
		<category><![CDATA[Artwork Evolution]]></category>
		<category><![CDATA[flurry]]></category>
		<category><![CDATA[idea]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[sales]]></category>

		<guid isPermaLink="false">http://paulsolt.com/?p=1173</guid>
		<description><![CDATA[<p>I&#8217;ve posted my presentation from the Computer Science Community at RIT on making iPhone/iPad apps from February 2011. The video is in two parts and I discuss the initial sales, analytics, marketing when releasing an iPhone app.</p> <p></p> <p>Update: 8/31/11 <a href="http://paulsolt.com/wp-content/uploads/2011/08/Idea-to-App-Store.pdf">Idea to App Store Slides (PDF)</a></p> <a title="Idea to App Store Part 1" href="http://www.youtube.com/watch?v=2uza2teEBEQ">Part 1:</a> [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve posted my presentation from the Computer Science Community at RIT on making iPhone/iPad apps from February 2011. The video is in two parts and I discuss the initial sales, analytics, marketing when releasing an iPhone app.</p>
<p><span id="more-1173"></span></p>
<p><strong>Update: 8/31/11</strong> <a href="http://paulsolt.com/wp-content/uploads/2011/08/Idea-to-App-Store.pdf">Idea to App Store Slides (PDF)</a></p>
<h2><a title="Idea to App Store Part 1" href="http://www.youtube.com/watch?v=2uza2teEBEQ">Part 1:</a></h2>
<p><a href="http://www.youtube.com/watch?v=2uza2teEBEQ&#038;fmt=18">http://www.youtube.com/watch?v=2uza2teEBEQ</a></p>
<h2><a title="Idea to App Store Part 2" href="http://www.youtube.com/watch?v=iyBis6W28Rw">Part 2:</a></h2>
<p><a href="http://www.youtube.com/watch?v=iyBis6W28Rw&#038;fmt=18">http://www.youtube.com/watch?v=iyBis6W28Rw</a></p>
]]></content:encoded>
			<wfw:commentRss>http://paulsolt.com/2011/08/idea-to-app-store-how-to-make-market-and-sell-your-iphone-app/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>iOS Development Presentation</title>
		<link>http://paulsolt.com/2011/06/ios-development-presentation/</link>
		<comments>http://paulsolt.com/2011/06/ios-development-presentation/#comments</comments>
		<pubDate>Sun, 12 Jun 2011 14:22:45 +0000</pubDate>
		<dc:creator>Paul Solt</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[presentation]]></category>
		<category><![CDATA[RIT]]></category>
		<category><![CDATA[slides]]></category>

		<guid isPermaLink="false">http://paulsolt.com/?p=1159</guid>
		<description><![CDATA[<p><a href="http://paulsolt.com/wp-content/uploads/2011/06/Screen-shot-2011-06-12-at-10.17.39-AM.png"></a>Here are my slides and demo code from the presentation on Friday, June 10th at 10am in ICL5 at RIT.</p> <p><a href="http://paulsolt.com/wp-content/uploads/2011/06/iPhoneOS-Development-III-Paul-Solt.pdf">iPhoneOS Development III &#8211; Paul Solt</a></p> <p><a href="http://paulsolt.com/wp-content/uploads/2011/06/csProject.zip">Gestures Demo</a></p> <p>&#160;</p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://paulsolt.com/wp-content/uploads/2011/06/Screen-shot-2011-06-12-at-10.17.39-AM.png"><img class="size-medium wp-image-1164 alignright" title="Gestures Demo" src="http://paulsolt.com/wp-content/uploads/2011/06/Screen-shot-2011-06-12-at-10.17.39-AM-159x300.png" alt="Gestures Demo" width="159" height="300" /></a>Here are my slides and demo code from the presentation on Friday, June 10th at 10am in ICL5 at RIT.</p>
<p><a href="http://paulsolt.com/wp-content/uploads/2011/06/iPhoneOS-Development-III-Paul-Solt.pdf">iPhoneOS Development III &#8211; Paul Solt</a></p>
<p><a href="http://paulsolt.com/wp-content/uploads/2011/06/csProject.zip">Gestures Demo</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://paulsolt.com/2011/06/ios-development-presentation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Transparent UITableView with Custom Background UIView and Tap Gestures</title>
		<link>http://paulsolt.com/2011/05/transparent-uitableview-with-custom-background-uiview-and-tap-gestures/</link>
		<comments>http://paulsolt.com/2011/05/transparent-uitableview-with-custom-background-uiview-and-tap-gestures/#comments</comments>
		<pubDate>Sat, 14 May 2011 23:38:41 +0000</pubDate>
		<dc:creator>Paul Solt</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[tap gesture]]></category>
		<category><![CDATA[transparent background]]></category>
		<category><![CDATA[uitableview]]></category>

		<guid isPermaLink="false">http://paulsolt.com/?p=1094</guid>
		<description><![CDATA[<p style="text-align: justify;">In order to create a custom background for a transparent UITableView you&#8217;ll need to do a few things. I&#8217;ve got the basic code below after a lot of tinkering. I&#8217;ve also included how to make it so you can hide the UITableView when you tap in the transparent areas below the rows using [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">In order to create a custom background for a transparent <code>UITableView</code> you&#8217;ll need to do a few things. I&#8217;ve got the basic code below after a lot of tinkering. I&#8217;ve also included how to make it so you can hide the <code>UITableView</code> when you tap in the transparent areas below the rows using a <code>UITapGestureRecognizer</code>. In the images below you can see the custom view in action.</p>
<div class="mceTemp" style="text-align: center;">
<dl id="attachment_1102" class="wp-caption alignnone" style="width: 169px;">
<dt class="wp-caption-dt"><a href="http://paulsolt.com/wp-content/uploads/2011/05/TableViewCustomBackground.png"><img class="size-medium wp-image-1102" title="TableViewCustomBackground" src="http://paulsolt.com/wp-content/uploads/2011/05/TableViewCustomBackground-159x300.png" alt="UITableView with custom backgroundView" width="159" height="300" /></a></dt>
<dd class="wp-caption-dd">UITableView with Custom Background</dd>
</dl>
</div>
<p style="text-align: center;"><a href="http://paulsolt.com/wp-content/uploads/2011/05/TableViewCustomBackground.png"></a><a href="http://paulsolt.com/wp-content/uploads/2011/05/TableViewHidden.png"><br />
</a></p>
<div id="attachment_1101" class="wp-caption aligncenter" style="width: 169px"><a href="http://paulsolt.com/wp-content/uploads/2011/05/TableViewHidden.png"><img class="size-medium wp-image-1101" title="TableViewHidden" src="http://paulsolt.com/wp-content/uploads/2011/05/TableViewHidden-159x300.png" alt="Hidden UITableView with Custom Background" width="159" height="300" /></a><p class="wp-caption-text">Hidden UITableView Showing Custom Background</p></div>
<p><strong>Key Points:</strong></p>
<ul>
<li style="text-align: justify;">Don&#8217;t subclass <code>UITableView</code>, instead use it as a instance variable in your own custom UIViewController subclass.</li>
<li style="text-align: justify;"> Create a custom <code>UIView</code> subclass to use as the background view, this will be visible when the <code>UITableView</code> is hidden or has a transparent background view.</li>
<li style="text-align: justify;"> On iPad make sure you clear the UITableView&#8217;s <code>backgroundView</code> and set it to <code>nil</code> in addition to setting the background color to<code>[UIColor clearColor]</code></li>
<li style="text-align: justify;"> Register a <code>UITapGestureRecognizer</code> with the viewController&#8217;s view and then set the attribute <code>cancelsTouches</code> to <code>NO</code> so that the touches from the gesture propagate to both the <code>UITableView</code> and the custom background view.</li>
<li style="text-align: justify;"> In the <code>-(void)handleTapGesture:</code> method you&#8217;ll want to send taps that don&#8217;t touch a row to toggle the UI so that the <code>UITableView</code> hides or unhides.</li>
</ul>
<p style="text-align: justify;"><strong>Notes:</strong></p>
<ul>
<li style="text-align: justify;">I show a <code>UINavigationBar</code>, so my <code>UITableView</code> frame needs to take into account the size of the navigation bar.</li>
<li style="text-align: justify;">Set the UILabel&#8217;s or custom views backgroundColor in the table&#8217;s cells to have <code>[UIColor clearColor]</code> so that they animate and fade correctly.</li>
</ul>
<p>See the sample code below:<br />
<script src="https://gist.github.com/972555.js?file=MyTransparentTableViewController.h"></script> <script src="https://gist.github.com/972555.js?file=MyTransparentTableViewController.m"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://paulsolt.com/2011/05/transparent-uitableview-with-custom-background-uiview-and-tap-gestures/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Limiting UIPinchGestureRecognizer Zoom Levels</title>
		<link>http://paulsolt.com/2011/03/limiting-uipinchgesturerecognizer-zoom-levels/</link>
		<comments>http://paulsolt.com/2011/03/limiting-uipinchgesturerecognizer-zoom-levels/#comments</comments>
		<pubDate>Sun, 27 Mar 2011 01:03:34 +0000</pubDate>
		<dc:creator>Paul Solt</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[gestures]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[zoom]]></category>

		<guid isPermaLink="false">http://paulsolt.com/?p=1069</guid>
		<description><![CDATA[<p>After wasting two days I&#8217;ve finally figured out how to correctly limit zoom levels when working with a UIPinchGestureRecognizer. I needed to resize images, but I didn&#8217;t want people to go outside of desirable limits.</p> <p><a href="http://paulsolt.com/wp-content/uploads/2011/03/Screen-shot-2011-03-26-at-8.58.08-PM.png"></a></p> <p>Here&#8217;s the basic math:</p> <p>1. We know: currentSize * scaleFactor = newSize</p> <p>2. Clamp the maximum scale factor [...]]]></description>
			<content:encoded><![CDATA[<p>After wasting two days I&#8217;ve finally figured out how to correctly limit zoom levels when working with a UIPinchGestureRecognizer. I needed to resize images, but I didn&#8217;t want people to go outside of desirable limits.</p>
<p><a href="http://paulsolt.com/wp-content/uploads/2011/03/Screen-shot-2011-03-26-at-8.58.08-PM.png"><img class="aligncenter size-full wp-image-1072" title="Zoom Factors" src="http://paulsolt.com/wp-content/uploads/2011/03/Screen-shot-2011-03-26-at-8.58.08-PM.png" alt="" width="396" height="744" /></a></p>
<p>Here&#8217;s the basic math:</p>
<p>1. We know: currentSize * scaleFactor = newSize</p>
<p>2. Clamp the maximum scale factor using the proportion maxScale / currentScale</p>
<p>3. Clamp the minimum scale factor using the proportion minScale / currentScale</p>
<p>The code below assumes there is an instance variable CGFloat lastScale and that a view has been set for the UIPinchGestureRecognizer.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>handlePinchGesture<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIPinchGestureRecognizer <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>gestureRecognizer <span style="color: #002200;">&#123;</span>
&nbsp;
<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>gestureRecognizer state<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> UIGestureRecognizerStateBegan<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
<span style="color: #11740a; font-style: italic;">// Reset the last scale, necessary if there are multiple objects with different scales</span>
lastScale <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>gestureRecognizer scale<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>gestureRecognizer state<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> UIGestureRecognizerStateBegan ||
<span style="color: #002200;">&#91;</span>gestureRecognizer state<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> UIGestureRecognizerStateChanged<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
CGFloat currentScale <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>gestureRecognizer view<span style="color: #002200;">&#93;</span>.layer valueForKeyPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;transform.scale&quot;</span><span style="color: #002200;">&#93;</span> floatValue<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// Constants to adjust the max/min values of zoom</span>
<span style="color: #a61390;">const</span> CGFloat kMaxScale <span style="color: #002200;">=</span> <span style="color: #2400d9;">2.0</span>;
<span style="color: #a61390;">const</span> CGFloat kMinScale <span style="color: #002200;">=</span> <span style="color: #2400d9;">1.0</span>;
&nbsp;
CGFloat newScale <span style="color: #002200;">=</span> <span style="color: #2400d9;">1</span> <span style="color: #002200;">-</span>  <span style="color: #002200;">&#40;</span>lastScale <span style="color: #002200;">-</span> <span style="color: #002200;">&#91;</span>gestureRecognizer scale<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>; <span style="color: #11740a; font-style: italic;">// new scale is in the range (0-1)</span>
newScale <span style="color: #002200;">=</span> MIN<span style="color: #002200;">&#40;</span>newScale, kMaxScale <span style="color: #002200;">/</span> currentScale<span style="color: #002200;">&#41;</span>;
newScale <span style="color: #002200;">=</span> MAX<span style="color: #002200;">&#40;</span>newScale, kMinScale <span style="color: #002200;">/</span> currentScale<span style="color: #002200;">&#41;</span>;
CGAffineTransform transform <span style="color: #002200;">=</span> CGAffineTransformScale<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>gestureRecognizer view<span style="color: #002200;">&#93;</span> transform<span style="color: #002200;">&#93;</span>, newScale, newScale<span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#91;</span>gestureRecognizer view<span style="color: #002200;">&#93;</span>.transform <span style="color: #002200;">=</span> transform;
&nbsp;
lastScale <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>gestureRecognizer scale<span style="color: #002200;">&#93;</span>;  <span style="color: #11740a; font-style: italic;">// Store the previous scale factor for the next pinch gesture call</span>
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://paulsolt.com/2011/03/limiting-uipinchgesturerecognizer-zoom-levels/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Artwork Evolution 1.2.80 Released!</title>
		<link>http://paulsolt.com/2011/02/artwork-evolution-1-2-80-released/</link>
		<comments>http://paulsolt.com/2011/02/artwork-evolution-1-2-80-released/#comments</comments>
		<pubDate>Mon, 21 Feb 2011 20:06:51 +0000</pubDate>
		<dc:creator>Paul Solt</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Artwork Evolution]]></category>
		<category><![CDATA[coffee table]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[ipod touch]]></category>
		<category><![CDATA[update]]></category>
		<category><![CDATA[wallpapers]]></category>

		<guid isPermaLink="false">http://paulsolt.com/?p=1058</guid>
		<description><![CDATA[Download <p style="padding-left: 30px;">Buy <a href="http://bit.ly/ArtworkEvolutionApp">Artwork Evolution on the App Store</a> and create wallpapers for iPhone, iPod Touch, and iPad!<br /> <a href="http://bit.ly/ArtworkEvolutionApp"></a></p> <a href="http://blog.artworkevolution.com/wp-content/uploads/2011/02/NewUISmallWeb.jpg"></a><a href="http://bit.ly/ArtworkEvolutionApp"></a> New Features Coffee Table Photos: Touch, slide, and flick photos off the table! Updated main screen user interface Video <p style="text-align: center;"> <p><a href="http://www.youtube.com/watch?v=xkwE8BRQsAo&#038;fmt=18">http://www.youtube.com/watch?v=xkwE8BRQsAo</a></p></p>]]></description>
			<content:encoded><![CDATA[<h3>Download</h3>
<p style="padding-left: 30px;">Buy <a href="http://bit.ly/ArtworkEvolutionApp">Artwork Evolution on the App Store</a> and create wallpapers for iPhone, iPod Touch, and iPad!<br />
<a href="http://bit.ly/ArtworkEvolutionApp"><img src="http://ax.phobos.apple.com.edgesuite.net/images/web/linkmaker/badge_appstore-lrg.gif" alt="Artwork Evolution - Paul Solt" /></a></p>
<div class="mceIEcenter">
<dl id="attachment_79" class="aligncenter">
<dt><a href="http://blog.artworkevolution.com/wp-content/uploads/2011/02/NewUISmallWeb.jpg"></a><a href="http://bit.ly/ArtworkEvolutionApp"><img class="aligncenter size-full wp-image-1061" title="NewUISmallWeb" src="http://paulsolt.com/wp-content/uploads/2011/02/NewUISmallWeb.jpg" alt="" width="360" height="780" /></a>
</dt>
</dl>
</div>
<h3>New Features</h3>
<ul>
<li>Coffee Table Photos: Touch, slide, and flick photos off the table!</li>
<li>Updated main screen user interface</li>
</ul>
<h3>Video</h3>
<p style="text-align: center;">
<p><a href="http://www.youtube.com/watch?v=xkwE8BRQsAo&#038;fmt=18">http://www.youtube.com/watch?v=xkwE8BRQsAo</a></p></p>
]]></content:encoded>
			<wfw:commentRss>http://paulsolt.com/2011/02/artwork-evolution-1-2-80-released/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Artwork Evolution on App Store</title>
		<link>http://paulsolt.com/2011/01/artwork-evolution-on-app-store/</link>
		<comments>http://paulsolt.com/2011/01/artwork-evolution-on-app-store/#comments</comments>
		<pubDate>Fri, 07 Jan 2011 01:43:11 +0000</pubDate>
		<dc:creator>Paul Solt</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[abstract art]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[art]]></category>
		<category><![CDATA[Artwork Evolution]]></category>
		<category><![CDATA[genetic art]]></category>
		<category><![CDATA[iPad]]></category>

		<guid isPermaLink="false">http://paulsolt.com/?p=1033</guid>
		<description><![CDATA[<p><a href="http://itunes.apple.com/us/app/artwork-evolution/id393135008?mt=8&#38;uo=4" target="itunes_store"></a></p> <p>Artwork Evolution, my first iOS App is now available on the <a title="Artwork Evolution on App Store" href="http://itunes.apple.com/us/app/artwork-evolution/id393135008?mt=8#">App Store for iPhone, iPod Touch, and iPad</a>. It allows you to create complex abstract art with the touch of a finger. You can breed images together to create new images.</p> <p style="text-align: center;"> Tutorial [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://itunes.apple.com/us/app/artwork-evolution/id393135008?mt=8&amp;uo=4" target="itunes_store"><img class="alignleft" style="border: 0;" src="http://ax.phobos.apple.com.edgesuite.net/images/web/linkmaker/badge_appstore-lrg.gif" alt="Artwork Evolution - Paul Solt" /></a></p>
<p>Artwork Evolution, my first iOS App is now available on the <a title="Artwork Evolution on App Store" href="http://itunes.apple.com/us/app/artwork-evolution/id393135008?mt=8#">App Store for iPhone, iPod Touch, and iPad</a>. It allows you to create complex abstract art with the touch of a finger. You can breed images together to create new images.</p>
<p style="text-align: center;">
<div id="attachment_1038" class="wp-caption aligncenter" style="width: 406px"><a href="http://paulsolt.com/wp-content/uploads/2011/01/Screen-shot-2011-01-06-at-8.35.20-PM.png"><img class="size-full wp-image-1038" title="Artwork Evolution on iPhone 4" src="http://paulsolt.com/wp-content/uploads/2011/01/Screen-shot-2011-01-06-at-8.35.20-PM.png" alt="" width="396" height="744" /></a><p class="wp-caption-text">Artwork Evolution on iPhone 4</p></div>
<h2>Tutorial Video</h2>
<p style="text-align: center;">
<p><a href="http://www.youtube.com/watch?v=_VZnFsnO4YY&#038;fmt=18">http://www.youtube.com/watch?v=_VZnFsnO4YY</a></p>
</p>
<p style="text-align: center;">
<p style="text-align: center;">
]]></content:encoded>
			<wfw:commentRss>http://paulsolt.com/2011/01/artwork-evolution-on-app-store/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Objective-C/C++ iPhone Build Failures</title>
		<link>http://paulsolt.com/2010/11/objective-cc-iphone-build-failures/</link>
		<comments>http://paulsolt.com/2010/11/objective-cc-iphone-build-failures/#comments</comments>
		<pubDate>Wed, 17 Nov 2010 03:38:31 +0000</pubDate>
		<dc:creator>Paul Solt</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[build errors]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[GCC]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://paulsolt.com/?p=994</guid>
		<description><![CDATA[<p>If you&#8217;re working with Objective-C/C++ (i.e. mixing both languages) in an iPhone/Mac application you may come across some strange errors in the build process due to a configuration issue.</p> error: bits/c++config.h: No such file or directory <p>One of my projects, Texture Evolution was a Mac application that referenced a C++ Mac library. About 6 months [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re working with Objective-C/C++ (i.e. mixing both languages) in an iPhone/Mac application you may come across some strange errors in the build process due to a configuration issue.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">error: bits<span style="color: #000000; font-weight: bold;">/</span>c++config.h: No such <span style="color: #c20cb9; font-weight: bold;">file</span> or directory</pre></div></div>

<div id="attachment_1005" class="wp-caption aligncenter" style="width: 467px"><a href="http://paulsolt.com/wp-content/uploads/2010/11/buildFailBits.png"><img class="size-full wp-image-1005 " title="buildFailBits" src="http://paulsolt.com/wp-content/uploads/2010/11/buildFailBits.png" alt="" width="457" height="560" /></a><p class="wp-caption-text">Too many build failures</p></div>
<p>One of my projects, Texture Evolution was a Mac application that referenced a C++ Mac library. About 6 months ago I ran into an issue where my build would fail. It may have been related to an update to Xcode, but I&#8217;m not entirely sure. After a lot of time, frustration, Google&#8217;ing, and project configuration changes I came across a solution.</p>
<p>Today I ran into the same problem and couldn&#8217;t quite remember how to fix it for my Doxygen Xcode documentation Target that references the C++ Mac library. I wasted more time trying to figure it out again, so here&#8217;s the breakdown.</p>
<h3>The Problem:</h3>
<p>Using iostream.h or other STL from C++ and compiling with the Base SDK set to 10.4 and GCC 4.0.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>Platforms<span style="color: #000000; font-weight: bold;">/</span>iPhoneOS.platform<span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>SDKs<span style="color: #000000; font-weight: bold;">/</span>iPhoneOS4.1.sdk<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>include<span style="color: #000000; font-weight: bold;">/</span>c++<span style="color: #000000; font-weight: bold;">/</span>4.0.0<span style="color: #000000; font-weight: bold;">/</span>iostream:<span style="color: #000000;">43</span>:<span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>Platforms<span style="color: #000000; font-weight: bold;">/</span>iPhoneOS.platform<span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>SDKs<span style="color: #000000; font-weight: bold;">/</span>iPhoneOS4.1.sdk<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>include<span style="color: #000000; font-weight: bold;">/</span>c++<span style="color: #000000; font-weight: bold;">/</span>4.0.0<span style="color: #000000; font-weight: bold;">/</span>iostream:<span style="color: #000000;">43</span>:<span style="color: #000000;">28</span>: error: bits<span style="color: #000000; font-weight: bold;">/</span>c++config.h: No such <span style="color: #c20cb9; font-weight: bold;">file</span> or directory
&nbsp;
<span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>Platforms<span style="color: #000000; font-weight: bold;">/</span>iPhoneOS.platform<span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>SDKs<span style="color: #000000; font-weight: bold;">/</span>iPhoneOS4.1.sdk<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>include<span style="color: #000000; font-weight: bold;">/</span>c++<span style="color: #000000; font-weight: bold;">/</span>4.0.0<span style="color: #000000; font-weight: bold;">/</span>iosfwd:<span style="color: #000000;">45</span>:<span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>Platforms<span style="color: #000000; font-weight: bold;">/</span>iPhoneOS.platform<span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>SDKs<span style="color: #000000; font-weight: bold;">/</span>iPhoneOS4.1.sdk<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>include<span style="color: #000000; font-weight: bold;">/</span>c++<span style="color: #000000; font-weight: bold;">/</span>4.0.0<span style="color: #000000; font-weight: bold;">/</span>iosfwd:<span style="color: #000000;">45</span>:<span style="color: #000000;">29</span>: error: bits<span style="color: #000000; font-weight: bold;">/</span>c++locale.h: No such <span style="color: #c20cb9; font-weight: bold;">file</span> or directory
&nbsp;
<span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>Platforms<span style="color: #000000; font-weight: bold;">/</span>iPhoneOS.platform<span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>SDKs<span style="color: #000000; font-weight: bold;">/</span>iPhoneOS4.1.sdk<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>include<span style="color: #000000; font-weight: bold;">/</span>c++<span style="color: #000000; font-weight: bold;">/</span>4.0.0<span style="color: #000000; font-weight: bold;">/</span>iosfwd:<span style="color: #000000;">46</span>:<span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>Platforms<span style="color: #000000; font-weight: bold;">/</span>iPhoneOS.platform<span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>SDKs<span style="color: #000000; font-weight: bold;">/</span>iPhoneOS4.1.sdk<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>include<span style="color: #000000; font-weight: bold;">/</span>c++<span style="color: #000000; font-weight: bold;">/</span>4.0.0<span style="color: #000000; font-weight: bold;">/</span>iosfwd:<span style="color: #000000;">46</span>:<span style="color: #000000;">25</span>: error: bits<span style="color: #000000; font-weight: bold;">/</span>c++io.h: No such <span style="color: #c20cb9; font-weight: bold;">file</span> or directory
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">11</span>,000+ other errors<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<h3>The Solution:</h3>
<p>Set the Base SDK to Mac OS X 10.5 and GCC to 4.2. You&#8217;ll need to make changes to project using the library as well as the libraries Target/Project settings. When you make changes make sure the Target properties displays &#8220;All Configurations&#8221; (i.e. Debug/Release/Release Adhoc/Release AppStore) so that you fix it for all of your build types. Double check and make sure that your static libraries and your project Targets have matching configurations.</p>
<p style="text-align: center;">
<div id="attachment_1000" class="wp-caption aligncenter" style="width: 471px"><a href="http://paulsolt.com/wp-content/uploads/2010/11/Screen-shot-2010-11-16-at-10.14.15-PM.png"><img class="size-full wp-image-1000 " title="Screen shot 2010-11-16 at 10.14.15 PM" src="http://paulsolt.com/wp-content/uploads/2010/11/Screen-shot-2010-11-16-at-10.14.15-PM.png" alt="" width="461" height="480" /></a><p class="wp-caption-text">Using Base SDK: Mac OS X 10.5 and GCC 4.2</p></div>
<h3>Why?</h3>
<p>It may be a simple configuration issue, but I&#8217;m not really sure. For some reason when I use GCC 4.0 it builds against arm and uses the iPhone SDK, but when I use GCC 4.2 it uses the Mac SDK. The library is explicitly targeting Mac OS X 10.4, but it doesn&#8217;t seem to work when it&#8217;s targeting GCC 4.0. Here&#8217;s the comparison build output:</p>
<h4>Base SDK Mac OS X 10.4, GCC 4.0</h4>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">CompileC <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution.build<span style="color: #000000; font-weight: bold;">/</span>Debug-CompileC <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution.build<span style="color: #000000; font-weight: bold;">/</span>Debug-iphoneos<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib.build<span style="color: #000000; font-weight: bold;">/</span>Objects-normal<span style="color: #000000; font-weight: bold;">/</span>armv6<span style="color: #000000; font-weight: bold;">/</span>Canvas.o ..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>source<span style="color: #000000; font-weight: bold;">/</span>Canvas.cpp normal armv6 <span style="color: #c20cb9; font-weight: bold;">c++</span> com.apple.compilers.gcc.4_0
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution<span style="color: #000000; font-weight: bold;">/</span>Xcode<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution
setenv LANG en_US.US-ASCII
setenv PATH <span style="color: #ff0000;">&quot;/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin&quot;</span>
<span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>Platforms<span style="color: #000000; font-weight: bold;">/</span>iPhoneOS.platform<span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>gcc-<span style="color: #000000;">4.0</span> <span style="color: #660033;">-x</span> <span style="color: #c20cb9; font-weight: bold;">c++</span> <span style="color: #660033;">-arch</span> armv6 <span style="color: #660033;">-fmessage-length</span>=<span style="color: #000000;">0</span> <span style="color: #660033;">-pipe</span> <span style="color: #660033;">-Wno-trigraphs</span> <span style="color: #660033;">-fpascal-strings</span> <span style="color: #660033;">-O0</span> <span style="color: #660033;">-Wreturn-type</span> <span style="color: #660033;">-Wunused-variable</span> <span style="color: #660033;">-isysroot</span> <span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>Platforms<span style="color: #000000; font-weight: bold;">/</span>iPhoneOS.platform<span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>SDKs<span style="color: #000000; font-weight: bold;">/</span>iPhoneOS4.1.sdk <span style="color: #660033;">-mfix-and-continue</span> <span style="color: #660033;">-gdwarf-2</span> <span style="color: #660033;">-mthumb</span> <span style="color: #660033;">-miphoneos-version-min</span>=<span style="color: #000000;">3.2</span> <span style="color: #660033;">-iquote</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution.build<span style="color: #000000; font-weight: bold;">/</span>Debug-iphoneos<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib.build<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib-generated-files.hmap -I<span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution.build<span style="color: #000000; font-weight: bold;">/</span>Debug-iphoneos<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib.build<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib-own-target-headers.hmap -I<span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution.build<span style="color: #000000; font-weight: bold;">/</span>Debug-iphoneos<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib.build<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib-all-target-headers.hmap <span style="color: #660033;">-iquote</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution.build<span style="color: #000000; font-weight: bold;">/</span>Debug-iphoneos<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib.build<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib-project-headers.hmap -F<span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>Debug-iphoneos -I<span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>Debug-iphoneos<span style="color: #000000; font-weight: bold;">/</span>include -I<span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution.build<span style="color: #000000; font-weight: bold;">/</span>Debug-iphoneos<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib.build<span style="color: #000000; font-weight: bold;">/</span>DerivedSources<span style="color: #000000; font-weight: bold;">/</span>armv6 -I<span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution.build<span style="color: #000000; font-weight: bold;">/</span>Debug-iphoneos<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib.build<span style="color: #000000; font-weight: bold;">/</span>DerivedSources <span style="color: #660033;">-fvisibility</span>=hidden <span style="color: #660033;">-c</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution<span style="color: #000000; font-weight: bold;">/</span>Xcode<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>source<span style="color: #000000; font-weight: bold;">/</span>Canvas.cpp <span style="color: #660033;">-o</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution.build<span style="color: #000000; font-weight: bold;">/</span>Debug-iphoneos<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib.build<span style="color: #000000; font-weight: bold;">/</span>Objects-normal<span style="color: #000000; font-weight: bold;">/</span>armv6<span style="color: #000000; font-weight: bold;">/</span>Canvas.o</pre></div></div>

<h4>Base SDK Mac OS X 10.5, GCC 4.2</h4>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">CompileC <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution.build<span style="color: #000000; font-weight: bold;">/</span>Debug<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib.build<span style="color: #000000; font-weight: bold;">/</span>Objects-normal<span style="color: #000000; font-weight: bold;">/</span>x86_64<span style="color: #000000; font-weight: bold;">/</span>Canvas.o <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution<span style="color: #000000; font-weight: bold;">/</span>Xcode<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>source<span style="color: #000000; font-weight: bold;">/</span>Canvas.cpp normal x86_64 <span style="color: #c20cb9; font-weight: bold;">c++</span> com.apple.compilers.gcc.4_2
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution<span style="color: #000000; font-weight: bold;">/</span>Xcode<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution
setenv LANG en_US.US-ASCII
<span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>gcc-<span style="color: #000000;">4.2</span> <span style="color: #660033;">-x</span> <span style="color: #c20cb9; font-weight: bold;">c++</span> <span style="color: #660033;">-arch</span> x86_64 <span style="color: #660033;">-fmessage-length</span>=<span style="color: #000000;">0</span> <span style="color: #660033;">-pipe</span> <span style="color: #660033;">-Wno-trigraphs</span> <span style="color: #660033;">-fpascal-strings</span> <span style="color: #660033;">-fasm-blocks</span> <span style="color: #660033;">-O0</span> <span style="color: #660033;">-Wreturn-type</span> <span style="color: #660033;">-Wunused-variable</span> <span style="color: #660033;">-isysroot</span> <span style="color: #000000; font-weight: bold;">/</span>Developer<span style="color: #000000; font-weight: bold;">/</span>SDKs<span style="color: #000000; font-weight: bold;">/</span>MacOSX10.5.sdk <span style="color: #660033;">-mfix-and-continue</span> <span style="color: #660033;">-mmacosx-version-min</span>=<span style="color: #000000;">10.5</span> <span style="color: #660033;">-gdwarf-2</span> <span style="color: #660033;">-iquote</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution.build<span style="color: #000000; font-weight: bold;">/</span>Debug<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib.build<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib-generated-files.hmap -I<span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution.build<span style="color: #000000; font-weight: bold;">/</span>Debug<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib.build<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib-own-target-headers.hmap -I<span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution.build<span style="color: #000000; font-weight: bold;">/</span>Debug<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib.build<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib-all-target-headers.hmap <span style="color: #660033;">-iquote</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution.build<span style="color: #000000; font-weight: bold;">/</span>Debug<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib.build<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib-project-headers.hmap -F<span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>Debug -I<span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>Debug<span style="color: #000000; font-weight: bold;">/</span>include -I<span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution.build<span style="color: #000000; font-weight: bold;">/</span>Debug<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib.build<span style="color: #000000; font-weight: bold;">/</span>DerivedSources<span style="color: #000000; font-weight: bold;">/</span>x86_64 -I<span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution.build<span style="color: #000000; font-weight: bold;">/</span>Debug<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib.build<span style="color: #000000; font-weight: bold;">/</span>DerivedSources <span style="color: #660033;">-fvisibility</span>=hidden <span style="color: #660033;">-c</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution<span style="color: #000000; font-weight: bold;">/</span>Xcode<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>source<span style="color: #000000; font-weight: bold;">/</span>Canvas.cpp <span style="color: #660033;">-o</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>paulsolt<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>xcode_build_output<span style="color: #000000; font-weight: bold;">/</span>ArtworkEvolution.build<span style="color: #000000; font-weight: bold;">/</span>Debug<span style="color: #000000; font-weight: bold;">/</span>MacEvolutionLib.build<span style="color: #000000; font-weight: bold;">/</span>Objects-normal<span style="color: #000000; font-weight: bold;">/</span>x86_64<span style="color: #000000; font-weight: bold;">/</span>Canvas.o</pre></div></div>

<h3>Notes:</h3>
<p>GCC 4.2 is required for 10.5, if you try and use the Base SDK of 10.4 and GCC 4.2 you&#8217;ll get this error.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">GCC <span style="color: #000000;">4.2</span> is not compatible with the Mac OS X <span style="color: #000000;">10.4</span> SDK</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://paulsolt.com/2010/11/objective-cc-iphone-build-failures/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone Unit Testing Explained &#8211; Part 1</title>
		<link>http://paulsolt.com/2010/11/iphone-unit-testing-explained-part-1/</link>
		<comments>http://paulsolt.com/2010/11/iphone-unit-testing-explained-part-1/#comments</comments>
		<pubDate>Fri, 05 Nov 2010 01:05:57 +0000</pubDate>
		<dc:creator>Paul Solt</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[application testing]]></category>
		<category><![CDATA[GHUnit]]></category>
		<category><![CDATA[Google Toolbox for Mac]]></category>
		<category><![CDATA[GTM iPhone Unit Testing]]></category>
		<category><![CDATA[logic testing]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[OCUnit]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[testable code]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://paulsolt.com/?p=717</guid>
		<description><![CDATA[<p></p> <p style="text-align: justify;">Here&#8217;s the first part of a multi-part iPhone Unit Testing Series. (Revised 11-9-10)<br /> </p> <p style="text-align: justify;">How comfortable are you on a bike without a helmet? Writing code without tests is like riding a bike without a helmet. You might feel free and indestructible for now, but one day you&#8217;ll fall [...]]]></description>
			<content:encoded><![CDATA[<p><!--350c049a2e764d7ea973ee5e4bbd8dcb--></p>
<p style="text-align: justify;"><em>Here&#8217;s the first part of a multi-part iPhone Unit Testing Series. (Revised 11-9-10)<br />
</em></p>
<p style="text-align: justify;">How comfortable are you on a bike without a helmet? Writing code without tests is like riding a bike without a helmet. You might feel free and indestructible for now, but one day you&#8217;ll fall and it&#8217;s going to hurt.</p>
<p style="text-align: justify;">I can&#8217;t start a new project without source control, it&#8217;s one of my requirements. Personally, I feel very uncomfortable and exposed without something to track my code changes. In reality, I hardly need to revert changes, but the knowledge that I can go back to something else enables me to make bigger and more confident changes.</p>
<p style="text-align: justify;">Testing should also be a requirement and it doesn&#8217;t get enough attention in the classroom or on code projects. Part of the problem is that there is a lack of information and the high learning curve. Most tutorials provide the bare minimum and don&#8217;t provide real world examples. There are two major hurdles that you&#8217;ll need to overcome.</p>
<h3 style="text-align: justify;">1. How do I use this testing framework?</h3>
<p style="text-align: justify;">Getting started with some new technology is always a daunting task. The only way you&#8217;re going to learn is if you teach yourself. Make sure to free yourself from distractions and get a cup of coffee so you can think clearly. When there are lots of unit testing frameworks and you need to evaluate what your requirements are going to be. For beginners it&#8217;s not always clear and you&#8217;re going to have to sample the available options.</p>
<ul style="text-align: justify;">
<li>C++: <a href="http://www.boost.org/doc/libs/1_35_0/libs/test/doc/components/utf/index.html">Boost Test Library</a>, <a href="http://code.google.com/p/googletest/">Google Test</a>, <a href="http://sourceforge.net/apps/mediawiki/cppunit/index.php?title=Main_Page">CppUnit</a> (<a href="http://gamesfromwithin.com/exploring-the-c-unit-testing-framework-jungle">C++ Unit Testing Roundup</a>)</li>
<li>Objective-C: <a href="http://developer.apple.com/library/ios/#documentation/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html">OCUnit</a>, <a href="http://code.google.com/p/google-toolbox-for-mac/wiki/iPhoneUnitTesting">GTM iPhone Unit Testing</a>, <a href="https://github.com/gabriel/gh-unit">GHUnit</a></li>
</ul>
<p style="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "pub-2182421302031373";
/* 468x15, created 11/9/10 */
google_ad_slot = "7180498408";
google_ad_width = 468;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
<h3 style="text-align: justify;">2. How do I write testable code?</h3>
<p style="text-align: justify;">Most computer science courses don&#8217;t explain how to write testable code, they focus on the output matching. Students assume that if my code displays X and I&#8217;m trying to display X, then the code must be correct. Testable code can be hard to master, but it&#8217;s worth the effort. There&#8217;s two important aspects of unit testing that I&#8217;ve discovered.</p>
<p style="padding-left: 30px; text-align: justify;">a. A unit test, or a set of unit tests, validates that the function you just wrote works like you think it works. It takes microseconds for the computer to tell you if something works or not, and it takes you seconds or minutes to validate if it works. Your time is valuable, let computers do the grunt work of testing and you&#8217;ll have more time to write code.</p>
<p style="padding-left: 30px; text-align: justify;">b. Unit tests force design testing. High-level designs don&#8217;t translate into direct code without usability issues. As you write and test code you will find that a function should take X parameters instead of Y parameters, or that the function name doesn&#8217;t match the functionality it provides. Take the time to fix your design and you&#8217;ll have code that&#8217;s easier to use and better documented. The sooner you fix design issues, the more time you&#8217;ll have to work on features.</p>
<p style="text-align: justify;">I still haven&#8217;t answered how to write <a href="http://developer.apple.com/library/ios/#documentation/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html#//apple_ref/doc/uid/TP40007959-CH20-SW12">testable code</a>. Getting started is a matter of baby steps; take two steps at a time, and soon you&#8217;ll be walking.</p>
<p style="padding-left: 30px; text-align: justify;">a. Isolate the basic functions that have clear input and output. Write a test that provides a function with good input and bad input. Think about what additional functions you&#8217;ll need to prove that the function you&#8217;re testing works as expected. For example, in order to test a setter function, you&#8217;ll need a getter function. As you write more tests, refactor common tasks into helper functions, so that you can spend more time testing functionality instead of writing boilerplate test code.</p>
<p style="padding-left: 30px; text-align: justify;">b. Make sure you <strong>document</strong> each function as you test it, if you don&#8217;t write comments now, it&#8217;s never going to happen. Documentation is best when the details of the function are fresh in your mind and you can explain the edge cases.</p>
<p style="text-align: justify;">Not everything is easy to test, but don&#8217;t be discouraged, since the tests you write will begin to validate that your code works as documented. You&#8217;re making progress and it&#8217;s going to get easier as you write more tests. Another benefit is that you&#8217;ll have higher quality code that you can rely on into the future.</p>
<p style="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-2182421302031373";
/* Large Post Ad */
google_ad_slot = "4358587115";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
<h2 style="text-align: justify;"><strong>iPhone Testing</strong></h2>
<p style="text-align: justify;">Over the past weekend I set out to integrate a unit test framework into my current project. I ended up testing three different frameworks: OCUnit, Google Toolbox for Mac (GTM) iPhone Unit Testing, and GHUnit. I will provide a brief overview and pros and cons to each framework and my final conclusion.</p>
<h3 style="text-align: justify;"><a href="http://www.sente.ch/software/ocunit/">OCUnit</a> (SenTesting)</h3>
<h5 style="text-align: justify;"><strong>Pros</strong>:  Xcode integration, acceptance testing during builds</h5>
<ul style="text-align: justify;">
<li>Xcode 2.1+ has built in support for unit testing using the <a href="http://www.sente.ch/software/ocunit/">OCUnit</a> testing (SenTesting) framework. It&#8217;s easy to create a new test case, since there are Xcode test/target templates.</li>
<li style="text-align: justify;">Xcode can display test failures like syntax errors with the <em>code bubbles</em> during the build/run stages, which can facilitate acceptance testing. These errors will link to the file and unit test that is failing, which is very helpful in terms of usability.</li>
</ul>
<p style="text-align: justify;">
<p style="text-align: justify;">
<div class="mceTemp mceIEcenter" style="text-align: justify;">
<dl id="attachment_854" class="wp-caption aligncenter" style="width: 565px;">
<dt class="wp-caption-dt"><a href="http://paulsolt.com/wp-content/uploads/2010/11/OCTest-Code-Bubble.png"><img class="size-full wp-image-854 " title="OCTest Code Bubble" src="http://paulsolt.com/wp-content/uploads/2010/11/OCTest-Code-Bubble.png" alt="" width="555" height="507" /></a></dt>
<dd class="wp-caption-dd">OCTest Unit Test Failure Code Bubble</dd>
</dl>
</div>
<p style="text-align: justify;">
<h5 style="text-align: justify;"><strong>Cons</strong>:  Project setup, test debugging, logic tests vs. application tests, device/simulator test limitations</h5>
<ul style="text-align: justify;">
<li>There are far too many steps required to create the unit tests in Xcode 3.2.4. I&#8217;m not sure why more of the process isn&#8217;t automated, maybe in Xcode 4? To provide test coverage I needed to create 3 additional test targets each with specific <a href="http://developer.apple.com/library/ios/#documentation/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html">settings</a>.</li>
<li>Writing a test for something basic (addition) is trivial using OCUnit, but testing code (memory management) that may crash isn&#8217;t. You need to follow a special set of instructions to get unit testing debugging work, otherwise you&#8217;ll be scratching your head. (<a href="http://cocoawithlove.com/2009/12/sample-iphone-application-with-complete.html">Link 1</a>) (<a href="http://chanson.livejournal.com/120740.html?thread=455332">Link 2</a>) (<a href="http://www.grokkingcocoa.com/how_to_debug_iphone_unit_te.html#disqus_thread">Link 3</a>)</li>
<li>Apple created their own categories of tests:<em> logic tests</em> and <em>application tests</em>, but the distinction isn&#8217;t clear. <em>Logic tests</em> are meant to test code that doesn&#8217;t use any UI code, while <em>Application tests</em> are designed for testing UI related code. This sounds fine, but when you try to create unit tests, the code you&#8217;re testing becomes very tightly coupled to the tests you can write.
<ul>
<li style="text-align: justify;">For example, <em>logic tests</em> are not run in an application, so code that would provide a <em>documents</em> or <em>bundle</em> directory for saving/loading may not work without refactoring the code. You&#8217;ll have to change something like:</li>
</ul>
</li>
</ul>
<pre style="text-align: justify;" lang="objc">[[NSBundle bundleForClass:[self class]] pathForResource:@"Icon" ofType:@"png"]</pre>
<p style="padding-left: 30px; text-align: justify;">into:</p>
<pre style="text-align: justify;" lang="objc">[[NSBundle mainBundle] pathForResource:@"Icon" ofType:@"png"];</pre>
<ul style="text-align: justify;">
<li>The biggest limitation is that <em>logic tests</em> only run using the iPhone Simulator and <em>application tests</em> only run on the device. <em>Logic tests </em>are not run when you build for the actual device, so you have to constantly switch between simulator/device to get acceptance test coverage. Running <em>application tests</em> only on the device is very slow, compared to running it in the iPhone Simulator.</li>
</ul>
<p style="text-align: justify;">
<div class="mceTemp mceIEcenter" style="text-align: justify;">
<dl id="attachment_856" class="wp-caption aligncenter" style="width: 538px;">
<dt class="wp-caption-dt"><a href="http://paulsolt.com/wp-content/uploads/2010/11/OCTest-Log-output.png"><img class="size-full wp-image-856 " title="OCTest Log output" src="http://paulsolt.com/wp-content/uploads/2010/11/OCTest-Log-output.png" alt="" width="528" height="517" /></a></dt>
<dd class="wp-caption-dd">OCTest Application Testing on the Device</dd>
</dl>
</div>
<p style="text-align: justify;">
<h3 style="text-align: justify;"><a href="http://code.google.com/p/google-toolbox-for-mac/wiki/iPhoneUnitTesting">Google Toolbox for Mac (GTM):  iPhone Unit Testing</a></h3>
<h5 style="text-align: justify;"><strong>Pros</strong>:  Xcode integration, acceptance testing during builds, easy setup</h5>
<ul style="text-align: justify;">
<li>GTM iPhone unit testing provides <em>code bubbles</em> with test failures, like OCUnit, when building the target for the iPhone Simulator. The failure indicators are better than OCUnit, since it includes the error icon on the line of failure in GTM. However, the <em>code bubbles</em> do not appear when building for the device. The code bubbles can be clicked on to take you to the unit test that is failing. You can perform acceptance testing when building for the iPhone Simulator.</li>
</ul>
<p style="text-align: justify;">
<p style="text-align: justify;">
<div class="mceTemp mceIEcenter" style="text-align: justify;">
<dl id="attachment_850" class="wp-caption aligncenter" style="width: 550px;">
<dt class="wp-caption-dt"><a href="http://paulsolt.com/wp-content/uploads/2010/11/GTM-Code-bubble.png"><img class="size-full wp-image-850 " title="GTM Code bubble" src="http://paulsolt.com/wp-content/uploads/2010/11/GTM-Code-bubble.png" alt="" width="540" height="539" /></a></dt>
<dd class="wp-caption-dd">GTM iPhone Unit Testing Test Failure Code Bubbles</dd>
</dl>
</div>
<p style="text-align: justify;">
<ul style="text-align: justify;">
<li>Compared to OCTest, GTM iPhone Unit Testing is a breeze to setup. You can write unit tests that target the UI and logic of your code within the same class.</li>
</ul>
<p style="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "pub-2182421302031373";
/* 468x15, created 11/9/10 */
google_ad_slot = "7180498408";
google_ad_width = 468;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
<h5 style="text-align: justify;"><strong>Cons</strong>:  Documentation, output</h5>
<ul style="text-align: justify;">
<li>GTM iPhone unit testing was straightforward to setup using the <a href="http://code.google.com/p/google-toolbox-for-mac/wiki/iPhoneUnitTesting">google code guide</a>.  The documentation is a little sparse, but it provides enough to get  going. I think pictures would help explain the process and help break up  all the text. I found the following visual <a href="http://www.kaomte.com/blog/?p=46">tutorial</a> semi-helpful, but there&#8217;s no definitive source.</li>
<li>When building a test and running the script during the build phase there is a lot of extraneous output that can be overwhelming. Some of the output is visible in the previous code bubble screenshot and the screenshot below. The output is not formatted as nicely as the OCTest output.</li>
</ul>
<p style="text-align: justify;">
<p style="text-align: justify;">
<div class="mceTemp mceIEcenter" style="text-align: justify;">
<dl id="attachment_852" class="wp-caption aligncenter" style="width: 552px;">
<dt class="wp-caption-dt"><a href="http://paulsolt.com/wp-content/uploads/2010/11/GTM-Log-Output.png"><img class="size-full wp-image-852 " title="GTM Log Output" src="http://paulsolt.com/wp-content/uploads/2010/11/GTM-Log-Output.png" alt="" width="542" height="449" /></a></dt>
<dd class="wp-caption-dd">GTM iPhone Unit Testing Log Output from a Test Run</dd>
</dl>
</div>
<h3 style="text-align: justify;"><a href="https://github.com/gabriel/gh-unit">GHUnit</a></h3>
<h5 style="text-align: justify;"><strong>Pros</strong>:  Device/simulator testing, easy debugging, easy setup, iPhone Test Result GUI, command line interface</h5>
<ul style="text-align: justify;">
<li>GHUnit has the easiest setup process of the three unit testing frameworks. It&#8217;s based on GTM and it is capable of running OCUnit, GTM, and GHUnit test cases. The <a href="http://gabriel.github.com/gh-unit/">documentation</a> is pretty good and there is a nice <a href="http://4arrowsmedia.com/2010/09/ghunit-setup/">visual setup guide</a>.</li>
</ul>
<ul style="text-align: justify;">
<li>GHUnit is easy to debug any test case without any additional setup. Place a breakpoint and run the test application in the simulator or on the device.</li>
<li>GHUnit provides a way to run tests on the command line, if you want to integrate with continuous integration tools. (<a href="http://hudson-ci.org/">Hudson</a>)</li>
</ul>
<ul style="text-align: justify;">
<li>The major selling point is that it provides a graphics user interface to display the results of each test, including test duration, if performance is important. The interface allows the user to switch between all tests and failed tests in a unit test application. Additionally, it drill into a test failure to display the unit test failure message and the stack trace. After using GHUnit, GTM Unit Testing leaves a lot to be desired beyond log output for visual feedback.
<ul>
<li>The GUI enables a pleasant workflow where you can set breakpoints and re-run tests to try and isolate bugs in the test code. The workflow replaces the need to perform acceptance testing during the build process, because it is so much more interactive.</li>
<li> On iPhone 4 it will resume on the <em>All/Failed</em> tests tab that you were last running/debugging. Note:  There is a minor issue described below in the <em>cons</em> section.</li>
</ul>
</li>
</ul>
<h5 style="text-align: justify;">
<div id="attachment_857" class="wp-caption aligncenter" style="width: 258px"><a href="http://paulsolt.com/wp-content/uploads/2010/11/GHUnit-Tests-1.png"><img class="size-full wp-image-857 " title="GHUnit Tests 1" src="http://paulsolt.com/wp-content/uploads/2010/11/GHUnit-Tests-1.png" alt="" width="248" height="462" /></a><p class="wp-caption-text">GHUnit Testing All Test Cases on the Device</p></div>
<div id="attachment_858" class="wp-caption aligncenter" style="width: 258px"><a href="http://paulsolt.com/wp-content/uploads/2010/11/GHUnit-Tests-2.png"><img class="size-full wp-image-858 " title="GHUnit Tests 2" src="http://paulsolt.com/wp-content/uploads/2010/11/GHUnit-Tests-2.png" alt="" width="248" height="462" /></a><p class="wp-caption-text">GHUnit Test Case Failures</p></div>
<p><div id="attachment_859" class="wp-caption aligncenter" style="width: 258px"><a href="http://paulsolt.com/wp-content/uploads/2010/11/GHUnit-Tests-3.png"><img class="size-full wp-image-859 " title="GHUnit Tests 3" src="http://paulsolt.com/wp-content/uploads/2010/11/GHUnit-Tests-3.png" alt="" width="248" height="462" /></a><p class="wp-caption-text">GHUnit Test Case Failure Message</p></div></h5>
<h5 style="text-align: justify;"><strong>Cons</strong>:  No acceptance testing, Documentation, minor GUI issues</h5>
<ul style="text-align: justify;">
<li>There is no way to run tests as part of the build process using GHUnit. It&#8217;s a paradigm shift from the OCUnit and other similar unit testing frameworks that enable testing during the build process. However, you can use a <a href="http://www.martinfowler.com/articles/continuousIntegration.html">continuous integration</a> framework to run unit testing as you check in code to a central repository.</li>
</ul>
<p style="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "pub-2182421302031373";
/* 468x15, created 11/9/10 */
google_ad_slot = "7180498408";
google_ad_width = 468;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
<ul style="text-align: justify;">
<li>Documentation is good, but it could be better. The behaviors of the GUI are not clearly defined. Finding the GHUnitIOS.Framework was not clear in the documentation. I updated an article on <a href="https://github.com/gabriel/gh-unit/wiki/Where-is-GHUnitIOS.Framework">github</a> that addressed the documentation issue.</li>
<li>There are some minor GUI issues, if you use the GUNIT_AUTORUN environment variable. If you switch to the <em>Failed</em> tests tab on the GUI, it will only run the failed tests. Running the subset is good when you&#8217;re fixing an issue, but it can be confusing if you&#8217;re adding a new test. The new test won&#8217;t run until you switch back to the <em>All</em> tests tab. Setting a breakpoint on the new test, will also do nothing, since it doesn&#8217;t run.
<ul>
<li>I&#8217;d like to see an additional button on the <em>Failed</em> tests tab that says &#8220;Run All Tests&#8221; and on the <em>All </em>tests tab a &#8220;Run Failed Tests&#8221; button. I think the additional buttons would make it clear that run doesn&#8217;t always do the same thing.</li>
</ul>
</li>
</ul>
<p style="text-align: justify;">
<p style="text-align: justify;">
<div class="mceTemp mceIEcenter" style="text-align: justify;">
<dl id="attachment_861" class="wp-caption aligncenter" style="width: 258px;">
<dt class="wp-caption-dt"><a href="http://paulsolt.com/wp-content/uploads/2010/11/One-previous-failure-fixed.png"><img class="size-full wp-image-861 " title="One previous failure fixed" src="http://paulsolt.com/wp-content/uploads/2010/11/One-previous-failure-fixed.png" alt="" width="248" height="462" /></a></dt>
<dd class="wp-caption-dd">Only the Test Failures are Rerun on the Failed Tests Tab</dd>
</dl>
</div>
<p style="text-align: justify;">
<p style="text-align: justify;">
<h3 style="text-align: justify;">Conclusion</h3>
<p style="text-align: justify;">After spending the weekend evaluating these unit testing frameworks I have decided to use GHUnit.  The testing interface is by far the easiest to see test results and it doesn&#8217;t require as much log output digging. I like the workflow I have when using GHUnit.</p>
<ol>
<li>Switch to the GHUnit Test Target</li>
<li>Write unit test for new function</li>
<li>Test new function (Command-R) and see it fails (Optional)</li>
<li>Stub and implement new function</li>
<li>Test implementation (Command-R). Repeat 4 until the test passes</li>
<li>Repeat for next function</li>
<li>Switch back to the Application Test Target</li>
</ol>
<p style="text-align: justify;">I will be providing a real world example on how to test an ImageCache class in the next part of the series. The ImageCache will be used to store images on the disk and in memory. It will keep a retain count for the number of times an image is retained/released and will clean up the memory when the image is no longer needed. The retain count enables multiple objects to reference the same image on disk. When the referencing objects are deleted we can remove the image from disk. The initial ImageCache design was based on the <a href="http://www.bignerdranch.com/book/iphone_programming_the_big_nerd_ranch_guide">iPhone Programming: the Big Nerd Ranch Guide</a></p>
<p style="text-align: justify;"><em>(Part II will cover unit testing my ImageCache class using GHUnit on the iPhone)</em></p>
<p style="text-align: center;"><script type="text/javascript"><!--
google_ad_client = "ca-pub-2182421302031373";
/* Large Post Ad */
google_ad_slot = "4358587115";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://paulsolt.com/2010/11/iphone-unit-testing-explained-part-1/feed/</wfw:commentRss>
		<slash:comments>36</slash:comments>
		</item>
	</channel>
</rss>

