<?xml version="1.0" encoding="UTF-8"?>
<!--Generated by Squarespace Site Server v5.11.81 (http://www.squarespace.com/) on Thu, 16 Feb 2012 20:09:48 GMT--><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rss="http://purl.org/rss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:cc="http://web.resource.org/cc/"><rss:channel rdf:about="http://www.nanaimostudio.com/blog/"><rss:title>Blog</rss:title><rss:link>http://www.nanaimostudio.com/blog/</rss:link><rss:description></rss:description><dc:language>en-US</dc:language><dc:date>2012-02-16T20:09:48Z</dc:date><admin:generatorAgent rdf:resource="http://www.squarespace.com/">Squarespace Site Server v5.11.81 (http://www.squarespace.com/)</admin:generatorAgent><rss:items><rdf:Seq><rdf:li rdf:resource="http://www.nanaimostudio.com/blog/2012/1/3/52-moments.html"/><rdf:li rdf:resource="http://www.nanaimostudio.com/blog/2011/11/24/happy-thanksgiving.html"/><rdf:li rdf:resource="http://www.nanaimostudio.com/blog/2011/11/22/taking-a-break.html"/><rdf:li rdf:resource="http://www.nanaimostudio.com/blog/2011/11/16/space-cadet.html"/><rdf:li rdf:resource="http://www.nanaimostudio.com/blog/2011/11/16/word-tracer-learn-chinese-in-action.html"/><rdf:li rdf:resource="http://www.nanaimostudio.com/blog/2011/11/15/word-tracer-learn-chinese-field-test.html"/><rdf:li rdf:resource="http://www.nanaimostudio.com/blog/2011/11/10/beta-testing-ios-apps-made-easy.html"/><rdf:li rdf:resource="http://www.nanaimostudio.com/blog/2011/10/22/useful-xcode-4-features.html"/><rdf:li rdf:resource="http://www.nanaimostudio.com/blog/2011/10/6/dissecting-cocos2d-ccdirector.html"/><rdf:li rdf:resource="http://www.nanaimostudio.com/blog/2011/10/6/thank-you-steve.html"/></rdf:Seq></rss:items></rss:channel><rss:item rdf:about="http://www.nanaimostudio.com/blog/2012/1/3/52-moments.html"><rss:title>52 Moments</rss:title><rss:link>http://www.nanaimostudio.com/blog/2012/1/3/52-moments.html</rss:link><dc:creator>Boon Chew</dc:creator><dc:date>2012-01-03T14:08:29Z</dc:date><dc:subject></dc:subject><content:encoded><![CDATA[<p><a href="http://52mmnts.me">52 Moments</a> is a new project we have embarked on with Canadian photographer Julian Bialowas.  It's created to help you live a more enriching life and your experience is then shared with people from around the world.</p>

<p>Each week you will be given a simple task to complete and the results is a series of photos submitted by the participants from around the world.  The project will go on for one year (hence the 52 in 52 moments)</p>

<p>The official launch for 52 Moments is Jan 13, 2012.  See you there.</p>

<p><span class="full-image-block ssNonEditable"><span><a href="http://52mmnts.me"><img src="http://www.nanaimostudio.com/storage/52mmnts.com.jpg?__SQUARESPACE_CACHEVERSION=1325599718677" alt="52 moments" /></a></span></span></p>
]]></content:encoded></rss:item><rss:item rdf:about="http://www.nanaimostudio.com/blog/2011/11/24/happy-thanksgiving.html"><rss:title>Happy Thanksgiving!</rss:title><rss:link>http://www.nanaimostudio.com/blog/2011/11/24/happy-thanksgiving.html</rss:link><dc:creator>Boon Chew</dc:creator><dc:date>2011-11-24T16:13:38Z</dc:date><dc:subject></dc:subject><content:encoded><![CDATA[<p><img src="https://img.skitch.com/20111124-8itmidsih6ipkeix1rb2cbhc9r.jpg" alt="Happy Thanksgiving" width="550" /></p>
]]></content:encoded></rss:item><rss:item rdf:about="http://www.nanaimostudio.com/blog/2011/11/22/taking-a-break.html"><rss:title>Taking a Break</rss:title><rss:link>http://www.nanaimostudio.com/blog/2011/11/22/taking-a-break.html</rss:link><dc:creator>Boon Chew</dc:creator><dc:date>2011-11-22T17:21:03Z</dc:date><dc:subject>artist designer painting red</dc:subject><content:encoded><![CDATA[<p>Our artist <span class="caps">RED </span>is taking a short break from having completed a few projects.  Here is a result of that.</p>

<div class="thumbnail"><a href="https://skitch.com/pixelrenderer/gkib6/shapes-m"><img style="max-width:500px" src="https://img.skitch.com/20111122-kkyu21d3qnnydfs8wutsf2953g.medium.jpg" alt="shapes_m" /></a><br /></div>
]]></content:encoded></rss:item><rss:item rdf:about="http://www.nanaimostudio.com/blog/2011/11/16/space-cadet.html"><rss:title>Space Cadet</rss:title><rss:link>http://www.nanaimostudio.com/blog/2011/11/16/space-cadet.html</rss:link><dc:creator>Boon Chew</dc:creator><dc:date>2011-11-17T03:01:36Z</dc:date><dc:subject>AppStore artist ipad painting red spacefinder</dc:subject><content:encoded><![CDATA[<p>Our artist <span class="caps">RED </span>did a sketch of the main character for our upcoming game Space Finder.</p>

<p><img src="https://img.skitch.com/20111117-n5qke96ec2ytpr4fiuipk9ee6w.jpg" alt="3[LAZKY5U~DXD}B$_8H}W2O" /></p>
]]></content:encoded></rss:item><rss:item rdf:about="http://www.nanaimostudio.com/blog/2011/11/16/word-tracer-learn-chinese-in-action.html"><rss:title>Word Tracer - Learn Chinese in Action</rss:title><rss:link>http://www.nanaimostudio.com/blog/2011/11/16/word-tracer-learn-chinese-in-action.html</rss:link><dc:creator>Boon Chew</dc:creator><dc:date>2011-11-16T17:52:51Z</dc:date><dc:subject>AppStore ipad wordtracer</dc:subject><content:encoded><![CDATA[<iframe width="560" height="315" src="http://www.youtube.com/embed/Cq1_z1qvN6E" frameborder="0" allowfullscreen></iframe>]]></content:encoded></rss:item><rss:item rdf:about="http://www.nanaimostudio.com/blog/2011/11/15/word-tracer-learn-chinese-field-test.html"><rss:title>Word Tracer - Learn Chinese Field Test</rss:title><rss:link>http://www.nanaimostudio.com/blog/2011/11/15/word-tracer-learn-chinese-field-test.html</rss:link><dc:creator>Boon Chew</dc:creator><dc:date>2011-11-15T22:46:20Z</dc:date><dc:subject>AppStore ipad wordtracer</dc:subject><content:encoded><![CDATA[<p>Ann Su homeschools her kids and she did a field test with Word Tracer on her kids recently.  I love the part in which Ann asked her 6-yr old kid Ian to practice on Word Tracer and then test him on a blank piece of paper later.  Word Tracer has been designed to be a fun and effective tool for both kids and adults and this review affirms that.</p>

<div class="thumbnail"><a href="http://home-su-cool.blogspot.com/2011/11/word-tracer-ipad-app-review.html"><img style="max-width:600px" src="https://img.skitch.com/20111115-rk85by783wibecnxeqbjby58fh.medium.jpg" alt="http://home-su-cool.blogspot.com/2011/11/word-tracer-ipad-app-review.html" /></a><br /></div>
]]></content:encoded></rss:item><rss:item rdf:about="http://www.nanaimostudio.com/blog/2011/11/10/beta-testing-ios-apps-made-easy.html"><rss:title>Beta Testing iOS Apps Made Easy</rss:title><rss:link>http://www.nanaimostudio.com/blog/2011/11/10/beta-testing-ios-apps-made-easy.html</rss:link><dc:creator>Boon Chew</dc:creator><dc:date>2011-11-10T15:48:27Z</dc:date><dc:subject>iOS idevblogaday idevblogaday qa testflight testing</dc:subject><content:encoded><![CDATA[<p>The success of iOS platform has spurred the creations of third party solutions that make certain aspects of iOS development less painful such as in-app purchase, push notifications and backend integration provided by companies like <a href="http://urbanairship.com/">Urban Airship</a> and <a href="https://www.parse.com/">Parse</a>.&nbsp; <a href="https://testflightapp.com/">TestFlight</a> is another such service and a damn awesome one. It was created to help facilitate your beta testing and lets you distribute your beta build over the air - made possible by the <a href="http://developer.applejavascript:noop().com/library/ios/#featuredarticles/FA_Wireless_Enterprise_App_Distribution/Introduction/Introduction.html">wireless app distribution model</a> added in iOS4.</p>
<p>Let's take a quick look at what <a href="https://testflightapp.com/">TestFlight</a> is all about and what they offer.&nbsp; For a complete overview of the latest and greatest of the service, you should of course sign up and visit the site directly.  If you are already using <a href="https://testflightapp.com/">TestFlight</a> for your beta testing, you can also skip this and go straight to the next section.</p>
<p>1) Sign in after registration</p>
<p><span class="full-image-block ssNonEditable"><span><img src="https://img.skitch.com/20111110-pjx1fc381ef4k8mmj798da2w3j.jpg?__SQUARESPACE_CACHEVERSION=1320944451316" alt="" /></span></span></p>
<p>2) Check the email on any of your test devices and login:</p>
<p><span class="full-image-block ssNonEditable"><span><img src="https://img.skitch.com/20111110-1x5316gsb77t3tmtc9dbbpr6tm.jpg?__SQUARESPACE_CACHEVERSION=1320944056376" alt="" /></span></span></p>
<p>3) Tap Register Device to send your <span class="caps">UDID </span>over to TestFlight.</p>
<p><span class="full-image-block ssNonEditable"><span><img src="https://img.skitch.com/20111110-jmqtjwiutqffygx7eb5hqix33i.jpg?__SQUARESPACE_CACHEVERSION=1320944150121" alt="" /></span></span></p>
<p>4) TestFlight sends back the provisioning profile over the air. What are you waiting for, tap Install!</p>
<p><span class="full-image-block ssNonEditable"><span><img src="https://img.skitch.com/20111110-kdd9rqfry5fr1n59d66ptrkejg.jpg?__SQUARESPACE_CACHEVERSION=1320944220964" alt="" /></span></span></p>
<p>5) Your device is now registered with your TestFlight's database.</p>
<p><span class="full-image-block ssNonEditable"><span><img src="https://img.skitch.com/20111110-k1hw8nkd1gk2rueijsrdxsu9ch.jpg?__SQUARESPACE_CACHEVERSION=1320944314095" alt="" /></span></span>&nbsp;</p>

<p>6) Now that you have registered some devices for testing, let's submit a build to TestFlight.<br />
<span class="full-image-block ssNonEditable"><span><img src="https://img.skitch.com/20111110-bw71ts1c7j3g6mnpyt3k4mbw5q.jpg?__SQUARESPACE_CACHEVERSION=1320955841619" alt=""/></span></span></p>

<p>7) We created the adhoc build in Xcode, saved the ipa file in Organizer, went to the folder where the ipa file is stored and dropped it here.  Notice that it's quite a bit of work -- we will discuss how to automate this step without relying on Xcode later in this article, giving you a more pleasant test flight. :)<br />
<span class="full-image-block ssNonEditable"><span><img src="https://img.skitch.com/20111110-tak7pcrjcbyspm2yrjyikp9qir.jpg?__SQUARESPACE_CACHEVERSION=1320956803302" alt=""/></span></span></p>

<p>8) When your ipa file is done uploading, this is what you will see, and it's where most of the power of TestFlight lies.  In particular, pay attention to the left pane: History shows you the upload history of each build of the app, along with feedback sent by testers (from within the app), crash reports, test session info (such as what your testers have tested and how long), etc.<br />
(Names and photos have been blurred to protect the innocence)<br />
<span class="full-image-block ssNonEditable"><span><img src="https://img.skitch.com/20111110-xwwpr1w2g7k5htyafcrqhck3k1.jpg?__SQUARESPACE_CACHEVERSION=1320957064172" alt=""/></span></span></p>

<p>9) Crashes has got to be the #1 concern when it comees to testing.  Be sure to upload your dSYM file so TestFlight can make sense of the crash reports coming from your build.<br />
<span class="full-image-block ssNonEditable"><span><img src="https://img.skitch.com/20111110-e89upjbhgkhjnpjbh4j47fxgwr.jpg?__SQUARESPACE_CACHEVERSION=1320957896163" alt=""/></span></span></p>

<p>10) This is an example crash report received from a test run of an app we worked on. Sexy, no?<br />
<span class="full-image-block ssNonEditable"><span><img src="https://img.skitch.com/20111110-ttqd86w9kx8t4u3x2xgdu9k4k.jpg?__SQUARESPACE_CACHEVERSION=1320955635463" alt=""/ width="739" /></span></span></p>

<p>At this point, assuming we have convinced you enough to start trying out <a href="https://testflightapp.com">TestFlight</a>, here comes one last goodies. (Names and photos have been blurred to protect the innocence) &nbsp; 

<p>Step (7) and (9) requires that you mess around with doing the build and uploading your ipa file and dSYM file to <a href="https://testflightapp.com">TestFlight</a>.  Wouldn't it be nice if this can somehow be taken care of as well?  Well, you have chosen the right profession. All you need is create a shell script to automate this task and to save you time, we have created a script to do precisely that. If you are a gluten for punishment, you can skip the following and continue to use the <a href="http://support.testflightapp.com/kb/tutorials/how-to-create-an-ipa-xcode-3">good old Xcode way</a>.</p>

<p>Quick <span class="caps">HOWTO</span>:<br />
1) Save the script above to build.sh<br />
2) chmod +x build-ipa.sh<br />
3) ./build-ipa.sh</p>

<p>Let's take a look at the script to automate the building and submission of our app to TestFlight:</p>



<pre style="width:600px">
#!/bin/sh
ProjectPath=&quot;~/Projects/Test/&quot;
Target=&quot;TestApp&quot;
AdHocPath=&quot;build/AdHoc-iphoneos/&quot;
AdHocConfigurationName=&quot;AdHoc&quot;
DeveloperName=&quot;developer name&quot;
ProvisionFile=&quot;8490865F-4F60-41BA-98EA-EA2E7B470CF2.mobileprovision&quot;
ipaName=&quot;TestApp&quot;
api_token=&quot;your test flight api key&quot;
team_token=&quot;your test flight team token&quot;
notes=&quot;Beta build #1&quot;

// Step (1)
xcodebuild -target &quot;$Target&quot; -configuration ${AdHocConfigurationName}

// Step (2)
xcrun -sdk iphoneos PackageApplication -v &quot;${AdHocPath}${Target}.app&quot; -o ${ProjectPath}${ipaName}.ipa --sign &quot;${DeveloperName}&quot; --embed ${ProvisionFile}

// Step (3)
pushd .
cd ${AdHocPath}
zip -r ${ipaName}.app.dSYM.zip ${Target}.app.dSYM/

// Step (4)
popd
curl -v http://testflightapp.com/api/builds.json \
  -F file=@${ipaName}.ipa \
  -F api_token=&quot;${api_token}&quot; \
  -F team_token=&quot;${team_token}&quot; \
  -F notes=&quot;${notes}&quot;\
  -F notify=True \
  -F replace=False \
  -F dsym=@${AdHocPath}${ipaName}.app.dSYM.zip 

// Step (5)
rm ${AdHocPath}${ipaName}.app.dSYM.zip
</pre>



<p>Explanations:</p>

<p>Step (1) Here we use the xcodebuild command to build the project of our choice.  Configure the target name and the configuration profile in the shell variables above it.  In our case we are doing an adhoc build for our TestApp.<br />
Step (2) We then use xcrun to create the ipa file.  The command also takes care of embedding the provisioning profile into the ipa.<br />
PackageApplication is a perl file locate at /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication<br />
The rest should be self-explanatory.</p>

<p><span class="caps">NOTE</span>: In case you wonder, ipa stands for iPhone Application.  It's technically a folder and in Unix a folder is essentially a file.</p>

<p>Step (3) After the ipa file is generated, the script proceeds to zip up the dSYM folder.  This way when TestFlight receives a crash report from your beta builds, it will be able to make sense of things in the event that you have configured the build setting for the build process to strip the debug symbols out of the build (e.g. to reduce file size).</p>

<p><span class="caps">NOTE</span>: We use the Unix command "pushd ." to save where we are at before traversing into the build folder so we can return later with "popd".</p>

<p>Step (4) We are now at ready to send the build off to TestFlight. Retract back to the project folder and use curl command to do the delivery.  The parameters should be self explanatory so we won't get into them.</p>

<p>Step (5) Finally we remove the dSYM zip file to keep things clean. You may choose to skip this step if you wish to keep it around for later use.</p>

<p>With the build uploaded to <a href="https://testflightapp.com/">TestFlight</a>, you can now notify your beta users to start testing it away! Perhaps the next logical step for TestFlight is to automate the finding of beta testers for developers (sorry, we couldn't automate this part with shell script).</p>

<p>"Thanks for flying with TestFlight and we hope you will fly with us again."</p>

<p>Disclaimer: This article is the result of our subject evaluation with TestFlight.  We are in no way affiliated with TestFlight and have received no bonus miles in promoting their service.</p>
]]></content:encoded></rss:item><rss:item rdf:about="http://www.nanaimostudio.com/blog/2011/10/22/useful-xcode-4-features.html"><rss:title>Useful Xcode 4 Features</rss:title><rss:link>http://www.nanaimostudio.com/blog/2011/10/22/useful-xcode-4-features.html</rss:link><dc:creator>Boon Chew</dc:creator><dc:date>2011-10-22T18:23:00Z</dc:date><dc:subject>idevblogaday</dc:subject><content:encoded><![CDATA[<p>Useful Xcode 4 features you probably seldom use:</p>
<p>1) Modified Navigation</p>
<p>Hold down Option key and click a file in the Project Navigator pane.&nbsp; The file opens up in the assitant editor window.</p>
<p>Hold down Command key and double click a file in the Project Navigator pane.&nbsp; The file opens up in a new window.</p>
<p>Hold down Shift + Option key and click a file in the Project Navigator pane.&nbsp; A coverflow view shows up and you can now choose where the file should appear.</p>
<p><span class="full-image-block ssNonEditable"><span><img src="https://img.skitch.com/20111017-1jh8pemhyrg64bbrun6duf714y.png?__SQUARESPACE_CACHEVERSION=1318875847557" alt="" /></span></span></p>
<p>&nbsp;</p>
<p>2) Show/hide Navigator</p>
<p>Command + 0 to show/hide the navigator.&nbsp; More space for your code!</p>
<p>To navigate around your code, use Open Quickly and Jump bar (discussed below).</p>
<p><span class="full-image-block ssNonEditable"><span><img src="https://img.skitch.com/20111017-31ynpndyky3tgadi7muwtmc3t.png?__SQUARESPACE_CACHEVERSION=1318878055383" alt="" /></span></span></p>
<p>3) Quick Help</p>
<p>Quick help does more than just showing you the documentation for Apple's API.&nbsp; It helps you out with the Build Settings as well.&nbsp; Thanks for the quick help!</p>
<p><span class="full-image-block ssNonEditable"><span><img src="https://img.skitch.com/20111017-g9n5fpbyxe71wdemmpi74qgn8t.png?__SQUARESPACE_CACHEVERSION=1318877782017" alt="" /></span></span></p>
<p>4) Jump bar</p>
<p>Jump bar is a great way to quickly navigate around your code without using the project navigator pane.&nbsp; Think of it as a mini version of project navigator.</p>
<p>Simply click and hold down your mouse in different section of the bar to access folders or files in that scope.</p>
<p>Command + click the jump bar to show the entries sorted alphabetically.&nbsp; Option click on a file to open it in the assistant editor view (just like it would in Project navigator).</p>
<p><span class="full-image-block ssNonEditable"><span><img src="https://img.skitch.com/20111022-cc8d96tsx84raa7rrjsdgpjsmn.png?__SQUARESPACE_CACHEVERSION=1319305927518" alt="" /></span></span></p>
<p>&nbsp;</p>
<p>With the jump bar popup list open, type any word to quickly find what you are looking for.&nbsp; Isn't that cool?</p>
<p><span class="full-image-block ssNonEditable"><span><img src="https://img.skitch.com/20111022-d3gbxh5uhnks3djafpnuymgk36.png?__SQUARESPACE_CACHEVERSION=1319306525220" alt="" /></span></span></p>
<p>Want to get to other files related to the current one? Click on the left most icon on the jump bar and you see this:</p>
<p><span class="full-image-block ssNonEditable"><span><img src="https://img.skitch.com/20111022-nnhybqgx84eiiij9i79g87y6k8.png?__SQUARESPACE_CACHEVERSION=1319306989903" alt="" /></span></span></p>
<p>5) Code Snippets</p>
<p>Code Snippet Library is a great way to speed up your coding.&nbsp; The greatest benefit comes from being able to define your own custom snippets by simply dragging your code snippet into the library.&nbsp; If you want your own text bubble, simply put it in between #text shows up in bubble#</p>
<p><span class="full-image-block ssNonEditable"><span><img src="https://img.skitch.com/20111022-g6pky4gp47u533c5941rkqq656.png?__SQUARESPACE_CACHEVERSION=1319305666533" alt="" /></span></span></p>
<p>&nbsp;</p>]]></content:encoded></rss:item><rss:item rdf:about="http://www.nanaimostudio.com/blog/2011/10/6/dissecting-cocos2d-ccdirector.html"><rss:title>Dissecting Cocos2D - CCDirector</rss:title><rss:link>http://www.nanaimostudio.com/blog/2011/10/6/dissecting-cocos2d-ccdirector.html</rss:link><dc:creator>Boon Chew</dc:creator><dc:date>2011-10-06T12:25:55Z</dc:date><dc:subject>cocos2d iOS idevblogaday</dc:subject><content:encoded><![CDATA[<p>Cocos2D is a great open source game framework created by Ricardo Quesada with contributions from its community. &nbsp;Not only does it save you time in creating 2D-based games for the iOS, a careful reading of the code will make you a better game developer and an iOS coder.</p>
<p>In this series, we will dissect Cocos2D a little bit at a time, pick up valuable coding techniques and examine design patterns and decisions utilized by Cocos2D along the way.</p>
<p>We will start off by looking at the entry point, the heart of Cocos2D - the <span class="caps">CCD</span>irector class. &nbsp;CCDirector is a singleton class that manages and coordinates the overall operation of your game. &nbsp;Another common name for this in a game framework is a Game Manager. &nbsp;Most of the time there is only one game manager managing an entire game, that's why <span class="caps">CCD</span>irector is a singleton class.</p>
<p>Let's look at some code snippets in <span class="caps">CCD</span>irector and see what we can learn from it:</p>



<pre>
static CCDirector *_sharedDirector = nil;

+ (CCDirector *)sharedDirector
{
	if (!_sharedDirector) {

		//
		// Default Director is TimerDirector
		// 
		if( [ [CCDirector class] isEqual:[self class]] )
			_sharedDirector = [[CC_DIRECTOR_DEFAULT alloc] init];
		else
			_sharedDirector = [[self alloc] init];
	}
		
	return _sharedDirector;
}

+(id)alloc
{
	NSAssert(_sharedDirector == nil, @&quot;Attempted to allocate a second instance of a singleton.&quot;);
	return [super alloc];
}

</pre>



<p>The above code snippet implements a singleton.  The static keyword appearing in the class scope has different semantic than had it appear in a method/function scope.  In class scope, the static keyword means your variable is internally linked only and therefore not visible outside of this class. In method/function scope, a static variable persists its value across multiple calls to the method, which makes it behaves like a member variable but visible to your method only.</p>

<p>The alloc method makes it so if you attempt to instantiate <span class="caps">CCD</span>irector directly (via the regular two-staged creation of alloc-init), your code will fail the assertion.</p>

<p>The code snippet above is typically how you would implement singleton for your class.</p>

<p>Notice the class check inside the init method, which isn't always present in typical singleton implementation.  What does this do?<br />
[ [CCDirector class] isEqual:[self class]]</p>

<p>This tests to see if the instantiation is on the abstract base class or from one of its derived concrete classes.  If it is from the base class, instantiate the default derived class via the macro CC_DIRECTOR_DEFAULT.  Currently there are four types of <span class="caps">CCD</span>irector-derived classes for iOS (implemented in <span class="caps">CCD</span>irectorIOS.m class) and one type for Mac (CCDirectorMac.m class).  <br />
For <span class="caps">CCD</span>irectorIOS, they are briefly: <span class="caps">CCD</span>irectoryTypeNSTimer, <span class="caps">CCD</span>irectorTypeMainLoop, <span class="caps">CCD</span>irectorTypeThreadMainLoop, and <span class="caps">CCD</span>irectorTypeDisplayLink.  We will look at these in more details in a later series.</p>


<p>Since we mention <span class="caps">CCD</span>irectorIOS, we will digress a little and look at one code snippet in <span class="caps">CCD</span>irectorIOS class:</p>



<pre>
@interface CCDirector ()
-(void) setNextScene;
-(void) showFPS;
-(void) calculateDeltaTime;
@end

</pre>



<p>This is a category method for <span class="caps">CCD</span>irector.  Why does it appear inside <span class="caps">CCD</span>irectorIOS?  Actually with this technique, you are able to implement <span class="caps">CCD</span>irector's private method setNextScene from within <span class="caps">CCD</span>irectorIOS that you wouldn't otherwise able to.  This is the same technique developers use to override Apple's private <span class="caps">API'</span>s implementation.  The downside to using category method technique to extend/change the behavior of a base class's method is that you can't call the base class's method like you can via inheritance using the super keyword.</p>

<p>That's all for this series.  In the next series, we will look at <span class="caps">CCD</span>irector in more details and learn a few tricks along the way.</p>
]]></content:encoded></rss:item><rss:item rdf:about="http://www.nanaimostudio.com/blog/2011/10/6/thank-you-steve.html"><rss:title>Thank you Steve</rss:title><rss:link>http://www.nanaimostudio.com/blog/2011/10/6/thank-you-steve.html</rss:link><dc:creator>Boon Chew</dc:creator><dc:date>2011-10-06T10:00:18Z</dc:date><dc:subject></dc:subject><content:encoded><![CDATA[<p>Steve, thank you for enriching our lives, for giving us a platform to express our creativity and a means to affect other's lives.&nbsp; We are indebted to you，Steve.</p>]]></content:encoded></rss:item></rdf:RDF>
