<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title>tonyarnold.com</title>
    <link>http://tonyarnold.com</link>
    <description>tonyarnold.com</description>
    <language>en-au</language>
    <generator>Symphony 2.1.0</generator>
    <atom:link href="http://tonyarnold.com/rss/" rel="self" type="application/rss+xml"/>
    <item>
      <title>Private methods in Objective-&#8203;C using categories</title>
      <link>http://tonyarnold.com/post/3138/private-methods-in-objective-c-using-categories</link>
      <pubDate>Tue, 04 May 2010 01:15:00 +1000</pubDate>
      <guid>http://tonyarnold.com/post/3138/private-methods-in-objective-c-using-categories</guid>
      <description>&lt;p&gt;&lt;img src="/workspace/blog-post-resources/danger_of_pulling_down_with_cage-1272899426.jpg" alt="Photo of a rusted gate in Croatia" /&gt;&lt;/p&gt;

&lt;p&gt;Objective-&amp;#8203;C is an incredibly flexible language, but there are a&amp;#160;few things I&amp;#160;don&amp;#8217;t think it handles very elegantly&amp;#8201;&amp;#8212;&amp;#8201;private methods are one of those things. Private methods are important when designing your classes&amp;#8201;&amp;#8212;&amp;#8201;keeping the implementation of your methods separate to the interface that users of your class see is good practice, and lets you change the way you implement things in future without making users of your class change their&amp;#160;code.&lt;/p&gt;

&lt;p&gt;Objective-&amp;#8203;C has a&amp;#160;great feature known as categories. In the &lt;a href="http://cocoadevcentral.com/d/learn_objectivec/"&gt;words of Scott Stevenson&lt;/a&gt;, &amp;#8220;a category allows you to add methods to an existing class without subclassing it or needing to know any of the details of how it&amp;#8217;s implemented&amp;#8221;. My private methods are implemented using an anonymous category on each class. These are also known as &amp;#8220;Class Extensions&amp;#8221; and they look like this in my &lt;code class="prettyprint"&gt;.m&lt;/code&gt; file:&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint"&gt;#import "MyGreatClass.h"

@interface MyGreatClass ()
- (void)MyGreatClass_somePrivateMethod;
@end

#pragma mark -
@implementation MyGreatClass

// Your standard methods for the class go here.

#pragma mark -
#pragma mark Private methods
- (void)MyGreatClass_somePrivateMethod {
  // Implement your private method here.
}

@end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;By declaring the method interface inside the class extension, rather than in your header, subclasses and users of your class cannot see the method, and thus can&amp;#8217;t use it. However within an instance of your class, the method is still usable!&lt;/p&gt;

&lt;p&gt;You&amp;#8217;ll notice that I&amp;#160;preface my private methods with the name of the current class&amp;#8201;&amp;#8212;&amp;#8201;I&amp;#160;do this to avoid method name collisions with subclasses. It&amp;#8217;s not strictly necessary, but it means I&amp;#160;don&amp;#8217;t have to think as hard when implementing subclasses of my&amp;#160;class.&lt;/p&gt;

&lt;p&gt;You can do everything you would in a&amp;#160;normal class &lt;strong&gt;except&lt;/strong&gt; declare new instance variables. I&amp;#160;often use my class extensions to redeclare a&amp;#160;public &lt;code class="prettyprint"&gt;readonly&lt;/code&gt; property as &lt;code class="prettyprint"&gt;readwrite&lt;/code&gt; within the confines of the class instance. Another common use in my code are the following two methods:&lt;/p&gt;

&lt;pre&gt;&lt;code class="prettyprint"&gt;- (void)MyGreatClass_registerObservers;
- (void)MyGreatClass_unregisterObservers;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;These methods are used to set up and tear down any Key/&amp;#8203;Value Observers and bindings for the current class. I&amp;#160;use these so often that &lt;a href="http://github.com/tonyarnold/CocoaBotsXcodeTemplates/"&gt;I&amp;#8217;ve put together an Xcode class template&lt;/a&gt; so that they are included in my classes by default.&lt;/p&gt;

&lt;p&gt;Please &lt;strong&gt;keep in mind that Objective-&amp;#8203;C has no true implementation of private methods&lt;/strong&gt;&amp;#8201;&amp;#8212;&amp;#8201;other classes can use these &amp;#8220;private&amp;#8221; methods if they know the structure of the method in question. With that said, I&amp;#160;still believe this is a&amp;#160;great way to keep your implementation as clean as possible.&lt;/p&gt;

&lt;h2&gt;Update&lt;/h2&gt;

&lt;p&gt;Both Paul and Collin make good points in the comments&amp;#8201;&amp;#8212;&amp;#8201;you can just declare your private methods inline in your class without using an anonymous category. That will work so long as the declaration occurs before the first use of the method. In my mind, there are two good reasons to use a&amp;#160;category:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Readability/&amp;#8203;cleanliness&lt;/strong&gt;&amp;#8201;&amp;#8212;&amp;#8201;I&amp;#160;find it a&amp;#160;lot easier to group the declarations for my private methods together inside the category block. It&amp;#8217;s quite readable and means I&amp;#160;can just look at the start of the source for each of my classes to see what private methods are defined;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It&amp;#8217;s the same when compiled&lt;/strong&gt;&amp;#8201;&amp;#8212;&amp;#8201;as I&amp;#160;understand it, anonymous categories are compiled into the same space as the methods for the class they are defined for. Functionally&amp;#8201;&amp;#8212;&amp;#8201;once the code is compiled&amp;#8201;&amp;#8212;&amp;#8201;there shouldn&amp;#8217;t be any difference between the two ways of defining the methods.&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>WWDC 2010: the death of the Mac (or&#160;not)</title>
      <link>http://tonyarnold.com/post/3572/wwdc-2010-the-death-of-the-mac-or-not</link>
      <pubDate>Mon, 03 May 2010 02:11:00 +1000</pubDate>
      <guid>http://tonyarnold.com/post/3572/wwdc-2010-the-death-of-the-mac-or-not</guid>
      <description>&lt;p&gt;It appears that &lt;a href="http://developer.apple.com/wwdc/"&gt;Apple&amp;#8217;s World Wide Developer&amp;#8217;s Conference&lt;/a&gt; (&lt;span class="caps"&gt;WWDC&lt;/span&gt;) is about &lt;a href="http://www.apple.com/iphone/preview-iphone-os/"&gt;iPhoneOS &lt;span class="numbers"&gt;4&lt;/span&gt;.&lt;span class="numbers"&gt;0&lt;/span&gt;&lt;/a&gt; this year. The focus of the advertising, the sessions and the announcements all appear to be firmly focused on iPhone and iPad development, and there&amp;#8217;s scarce mention of the Mac in amongst the copy. This in and of itself is fine&amp;#8201;&amp;#8212;&amp;#8201;the focus of the last &lt;span class="numbers"&gt;2&lt;/span&gt;&amp;#160;years (&lt;span class="numbers"&gt;2008&lt;/span&gt;&amp;#8722;&lt;span class="numbers"&gt;2009&lt;/span&gt;) was pretty clearly on Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X &amp;#8220;Snow Leopard&amp;#8221;, so given the impending release of a&amp;#160;major operating system release for the iPhone (and eventually iPad) I&amp;#160;can understand why they&amp;#8217;d be focusing on their new&amp;#160;baby.&lt;/p&gt;

&lt;p&gt;&lt;img src="/workspace/blog-post-resources/wwdc_moscone_2008-1272881343.jpg" alt="WWDC2008 Moscone" /&gt;&lt;/p&gt;

&lt;p&gt;But it&amp;#8217;s raised a&amp;#160;bit of an irate response from the more Mac-&amp;#8203;focused developers&amp;#8201;&amp;#8212;&amp;#8201;&amp;#8220;&lt;a href="http://en.wikipedia.org/wiki/What_About_Me_(song)"&gt;What about me?&lt;/a&gt;&amp;#8221;. At first, I&amp;#160;was incensed too&amp;#8201;&amp;#8212;&amp;#8201;why would I&amp;#160;want to pay close to $&lt;span class="numbers"&gt;6000&lt;/span&gt; &lt;span class="caps"&gt;AUD&lt;/span&gt; for tickets, flights, accommodation and food to go to a&amp;#160;conference that&amp;#8217;s taken the focus off my primary development platform? I&amp;#160;get it, though&amp;#8201;&amp;#8212;&amp;#8201;it makes sense. And yeah, I&amp;#8217;d get some benefit from the iPhone &lt;span class="caps"&gt;OS&lt;/span&gt; sessions. However, I&amp;#8217;m pretty certain that I&amp;#160;wouldn&amp;#8217;t get $&lt;span class="numbers"&gt;6000&lt;/span&gt; worth of benefit this year, so I&amp;#8217;m putting my hard earned money to one side for this year in the hopes that &lt;span class="caps"&gt;WWDC&lt;/span&gt; &lt;span class="numbers"&gt;2011&lt;/span&gt; is a&amp;#160;better fit for my needs. As are a&amp;#160;number of other high profile Mac developers (who I&amp;#160;was really looking forward to catching up with, you bastards!). But that&amp;#8217;s &lt;span class="caps"&gt;OK&lt;/span&gt;&amp;#8201;&amp;#8212;&amp;#8201;there are more iPhoneOS developers than there are Mac developers these days anyway so &lt;span class="caps"&gt;WWDC&lt;/span&gt; will still sell out and the planet will continue to&amp;#160;turn.&lt;/p&gt;

&lt;p&gt;The only part I&amp;#160;don&amp;#8217;t understand is taking the Apple Design Awards away from Mac developers, but then the iPhone OS-&amp;#8203;based ADAs this year are a&amp;#160;locked down shadow of what the ADAs used to be, so I&amp;#160;don&amp;#8217;t think I&amp;#8217;ll waste too many words on this except to say that outwardly it&amp;#8217;s a&amp;#160;pretty shitty move from Apple. My oft-&amp;#8203;unused rational brain says that &lt;span class="numbers"&gt;5&lt;/span&gt;&amp;#160;weeks for &lt;span class="caps"&gt;ADA&lt;/span&gt; submissions and selection for both platforms seems a&amp;#160;little tight, but all of the &lt;span class="caps"&gt;WWDC&lt;/span&gt; material feels rushed and unfinished this year. It&amp;#8217;s as good an excuse in my brain as&amp;#160;any.&lt;/p&gt;

&lt;p&gt;My opinion is that next year&amp;#8217;s &lt;span class="caps"&gt;WWDC&lt;/span&gt; will have a&amp;#160;greater focus on whatever future version of Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X&amp;#160;Apple are working on&amp;#8201;&amp;#8212;&amp;#8201;let&amp;#8217;s call it &amp;#8220;Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X&amp;#160;&lt;span class="numbers"&gt;10&lt;/span&gt;.&lt;span class="numbers"&gt;7&lt;/span&gt;&amp;#8243; for the rest of this post, understanding that it might be called &amp;#8220;Cecil&amp;#8221;, or something far less interesting when it actually comes out. The design awards will have a&amp;#160;Mac category again, and we&amp;#8217;ll all get excited about what&amp;#8217;s coming next.&lt;/p&gt;

&lt;h2&gt;You know what really grinds my&amp;#160;gears?&lt;/h2&gt;

&lt;p&gt;So here&amp;#8217;s the bit that&amp;#8217;s annoying me: there is a&amp;#160;vocal contingent of Cocoa developers who are saying loud and proud that the iPhone and iPad are the future of computing, and that developers should be shifting their business and efforts to these platforms (and subsequently away from the Mac). Just sit back and think about this for a&amp;#160;minute&amp;#8201;&amp;#8212;&amp;#8201;&lt;strong&gt;if you were forced to use just your iPhone or iPad to do everything you do now, could you do&amp;#160;it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m not Joe Average, but I&amp;#160;certainly couldn&amp;#8217;t.&lt;/p&gt;

&lt;p&gt;There are plenty of things I&amp;#160;can (and do) get away with on my iPhone &lt;span class="caps"&gt;&lt;span class="numbers"&gt;3&lt;/span&gt;GS&lt;/span&gt;&amp;#8201;&amp;#8212;&amp;#8201;basic emailing, basic browsing, simple task management, etc. You&amp;#8217;ll pry the damned thing from my cold, dead hands. But &lt;strong&gt;I&amp;#160;can&amp;#8217;t get real, honest-&amp;#8203;to-&amp;#8203;god work done on my iPhone without serious impact to my time and productivity&lt;/strong&gt; (I also can&amp;#8217;t use Xcode, so that&amp;#8217;s going to stop me right there&amp;#8201;&amp;#8212;&amp;#8201;but let&amp;#8217;s ignore that for&amp;#160;now).&lt;/p&gt;

&lt;h2&gt;It&amp;#8217;s about style, baby&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Before I&amp;#160;begin:&lt;/strong&gt; I&amp;#8217;m purposely leaving games out of this argument&amp;#8201;&amp;#8212;&amp;#8201;this is about replacing my desktop computer, and I&amp;#160;don&amp;#8217;t use my desktop computer for&amp;#160;games.&lt;/p&gt;

&lt;p&gt;The style of applications on the iPhone and iPad are usually simpler, cut-&amp;#8203;down versions of their desktop cousins&amp;#8201;&amp;#8212;&amp;#8201;there&amp;#8217;s only a&amp;#160;few apps I&amp;#160;can think of that have feature parity with their desktop counterparts. &lt;a href="http://www.atebits.com/tweetie-iphone/"&gt;Tweetie&lt;/a&gt; and &lt;a href="http://twitterrific.com/"&gt;Twitteriffic&lt;/a&gt; are examples that come to mind (although arguably their desktop versions have been left to die for the past year). I&amp;#8217;ve not used the iPad-&amp;#8203;based iWork suite yet&amp;#8201;&amp;#8212;&amp;#8201;&lt;em&gt;which I&amp;#8217;d pinned high hopes on&lt;/em&gt;&amp;#8201;&amp;#8212;&amp;#8201;but the reviews are pretty clear that these are not complete replacements for iWork on the desktop. I&amp;#160;also don&amp;#8217;t see a&amp;#160;full replacement for iPhoto, GarageBand or any of Apple&amp;#8217;s consumer apps. In fact, there&amp;#8217;s very little in the way of rich content creation.&lt;/p&gt;

&lt;p&gt;I expect that the larger screen and differing user interface on the iPad will go some of the way toward addressing this issue in time, but &lt;strong&gt;the iPhone is unlikely to offer as rich or productive an experience as a&amp;#160;well developed, fully-&amp;#8203;featured desktop application&lt;/strong&gt;. Prettier? Yeah, sure&amp;#8201;&amp;#8212;&amp;#8201;maybe. More fun? Perhaps&amp;#8201;&amp;#8212;&amp;#8201;there are some great iPhone apps out there. But genuine, get work done all day long every day apps? Not yet. Not by a&amp;#160;long shot.&lt;/p&gt;

&lt;h2&gt;Innovation? Where?&lt;/h2&gt;

&lt;p&gt;One of the key arguments being used is that there appears to be a&amp;#160;lack of innovation on the desktop lately. I&amp;#8217;d argue there&amp;#8217;s little real innovation occurring on either side of the&amp;#160;fence.&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s not saying that there aren&amp;#8217;t some really cool apps being developed. Wrappers around oft-&amp;#8203;used sites that are infinitely more usable than the original site. Quick methods of letting your friends know how banal your existence is by using your location. Nifty ways to tune my guitar.&lt;/p&gt;

&lt;p&gt;There have been some real interaction improvements based upon the touch-&amp;#8203;based user interface&amp;#8201;&amp;#8212;&amp;#8201;&amp;#8220;&lt;em&gt;pull down to refresh&lt;/em&gt;&amp;#8221; in &lt;a href="http://www.atebits.com/tweetie-iphone/"&gt;Tweetie&lt;/a&gt; is one of them. But take the whole &amp;#8220;I can use my fingers&amp;#8221; thing off the table (and I&amp;#8217;m genuinely interested in an answer to this question)&amp;#8201;&amp;#8212;&amp;#8201;what exactly are these wonderful innovations being bandied about on the touch platforms? Touch itself? That&amp;#8217;s been around for years in similar (albeit poorly implemented) forms. I&amp;#160;do want to know, because I&amp;#8217;m still seeing user interface conventions like tableviews and drawers from &lt;span class="numbers"&gt;2005&lt;/span&gt;, gussied up with some iPhone make-&amp;#8203;up.&lt;/p&gt;

&lt;h2&gt;You&amp;#8217;re just a&amp;#160;hater, silly old-&amp;#8203;time developer!&lt;/h2&gt;

&lt;p&gt;I assure you: &lt;strong&gt;I&amp;#160;most definitely am not&lt;/strong&gt; (a hater, or old&amp;#8201;&amp;#8212;&amp;#8201;although I&amp;#160;do have a&amp;#160;few grey hairs in my beard that weren&amp;#8217;t there last year). I&amp;#160;love my iPhone. I&amp;#8217;ll buy an iPad when they&amp;#8217;re available here in Australia. I&amp;#160;am, do and will continue to develop apps for the iPhone &lt;span class="caps"&gt;OS&lt;/span&gt;&amp;#8201;&amp;#8212;&amp;#8201;it&amp;#8217;s a&amp;#160;marvellous, groundbreaking piece of technology.&lt;/p&gt;

&lt;p&gt;I also agree with the &lt;strong&gt;basic&lt;/strong&gt; sentiment being expressed&amp;#8201;&amp;#8212;&amp;#8201;input other than physical keyboards and mice will eventually take over for standard interaction with our computers. I&amp;#160;also think the iPad is a&amp;#160;glimpse at something wonderful. But &lt;strong&gt;it&amp;#8217;s a&amp;#160;glimpse, not the whole picture&lt;/strong&gt;. I&amp;#8217;m also not surprised by the noise coming from the iPhone &lt;span class="caps"&gt;OS&lt;/span&gt; camp&amp;#8201;&amp;#8212;&amp;#8201;it&amp;#8217;s new, it&amp;#8217;s shiny and there are (some) people making an absolutely killing off the sales of their apps. Some of those apps are actually genuine leaps forward in terms of using the new interaction models that Apple&amp;#8217;s designed for the iPhone.&lt;/p&gt;

&lt;p&gt;But in my opinion, it&amp;#8217;s not the end of the desktop or the&amp;#160;Mac.&lt;/p&gt;

&lt;h2&gt;Fin?&lt;/h2&gt;

&lt;p&gt;I believe the Mac has a&amp;#160;heck of a&amp;#160;lot of life left in it. Will the fun end some day? Sure. Will it be brought about by iPhone &lt;span class="caps"&gt;OS&lt;/span&gt;&amp;#8201;&amp;#8212;&amp;#8201;no, I&amp;#160;genuinely believe it won&amp;#8217;t. When there&amp;#8217;s something better to replace everything we use our Macs for now, I&amp;#8217;m sure Apple will retire the mantle. Until then, we&amp;#8217;ll have divergent technologies with differing purposes.&lt;/p&gt;

&lt;p&gt;Yep, I&amp;#8217;m biased&amp;#8201;&amp;#8212;&amp;#8201;I&amp;#160;love developing for the Mac, so I&amp;#8217;ll still be at it even when I&amp;#160;have award winning, billion-&amp;#8203;dollar-&amp;#8203;a-&amp;#8203;year apps in the app store&amp;#160;(heh).&lt;/p&gt;

&lt;p&gt;Am I&amp;#160;done? Not quite. &amp;#8220;One last thing&amp;#8221; as the saying goes:&lt;/p&gt;

&lt;p&gt;My message to the &amp;#8220;Mac is dead&amp;#8221; crowd&amp;#8201;&amp;#8212;&amp;#8201;have the foresight to preface your statements with &amp;#8220;in my opinion&amp;#8221;. It&amp;#8217;s less inflammatory than stating your opinion as if it were fact, and you won&amp;#8217;t feel quite so bad when it doesn&amp;#8217;t happen. &lt;strong&gt;Wait, that wouldn&amp;#8217;t draw attention to your iPhone apps, would it?&lt;/strong&gt; #waitiseewhatyoudidthere&lt;/p&gt;

&lt;p&gt;Now, &lt;a href="http://thecocoabots.com/"&gt;go look at my Mac apps&lt;/a&gt;. Fin.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Making your iPhone app&#8217;s maps work like Apple&#8217;s</title>
      <link>http://tonyarnold.com/post/3139/making-your-iphone-apps-maps-work-like-apples</link>
      <pubDate>Wed, 21 Apr 2010 17:35:00 +1000</pubDate>
      <guid>http://tonyarnold.com/post/3139/making-your-iphone-apps-maps-work-like-apples</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; These instructions have been tested under iPhone &lt;span class="caps"&gt;SDK&lt;/span&gt; &lt;span class="numbers"&gt;3&lt;/span&gt;.&lt;span class="numbers"&gt;1&lt;/span&gt;&amp;#8201;&amp;#8212;&amp;#8201;they will probably work under future releases of the iPhone &lt;span class="caps"&gt;OS&lt;/span&gt;, but I&amp;#160;don&amp;#8217;t make any guarantees. &lt;strong&gt;Don&amp;#8217;t ever blindly include code in your apps&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve had the opportunity to work on a&amp;#160;couple of smaller iPhone apps that include &lt;code class="prettyprint"&gt;MKMapView&lt;/code&gt; components to show the location of stores and other items of interest. One of the things I&amp;#160;found a&amp;#160;little challenging was that the map views didn&amp;#8217;t work quite the same way as those found within Apple&amp;#8217;s Maps.app on the iPhone. I&amp;#160;mean, sure&amp;#8201;&amp;#8212;&amp;#8201;you can pan around the map with your fingers and zoom in and out by pinching, so the basics are there&amp;#8201;&amp;#8212;&amp;#8201;but once you start tracking the user&amp;#8217;s current location (&lt;code class="prettyprint"&gt;showsUserLocation&lt;/code&gt;) all the nice stuff just falls&amp;#160;away.&lt;/p&gt;

&lt;p&gt;&lt;img src="/workspace/blog-post-resources/ttm_example-1271835311.png" alt="class:right;; alt:Image of the sample application" /&gt;Try it now&amp;#8201;&amp;#8212;&amp;#8201;pop open the Maps app on your iPhone and tap the little crosshair button in the lower left corner of the map to show your current location. Straight away you&amp;#8217;ll notice that the map zooms and scrolls to centre on your current location. Now try moving the map around&amp;#8201;&amp;#8212;&amp;#8201;the map location follows your fingers, with that pretty blue pulsing dot tailing your every move. Nice, huh? &lt;span class="caps"&gt;OK&lt;/span&gt;, now scroll the map somewhere else using your fingers. What happened? The &lt;code class="prettyprint"&gt;showsUserLocation&lt;/code&gt; property just set itself to &lt;code class="prettyprint"&gt;NO&lt;/code&gt; and the map stopped following you. Right thing to do, hey? Guess what&amp;#8201;&amp;#8212;&amp;#8201;that&amp;#8217;s not standard behaviour if you just drop an &lt;code class="prettyprint"&gt;MKMapView&lt;/code&gt; into your app. The good news is that it&amp;#8217;s not hard to copy this behaviour, and you don&amp;#8217;t have to use private APIs either (nice!).&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s how an &lt;code class="prettyprint"&gt;MKMapView&lt;/code&gt; is structured at the highest levels (in a&amp;#160;very loose&amp;#160;sense):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code class="prettyprint"&gt;MKMapView&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code class="prettyprint"&gt;UIView&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code class="prettyprint"&gt;UIScrollView&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that&amp;#8217;s what makes it nice and easy to replicate this behaviour&amp;#8201;&amp;#8212;&amp;#8201;the &lt;code class="prettyprint"&gt;UIScrollView&lt;/code&gt; has a&amp;#160;property named &lt;code class="prettyprint"&gt;contentOffset&lt;/code&gt; that we can watch for changes using Key/&amp;#8203;Value Observation. When the &lt;code class="prettyprint"&gt;contentOffset&lt;/code&gt; property changes, we can quickly check if the user is making the changes (in which case we want to turn off our &lt;code class="prettyprint"&gt;showsUserLocation&lt;/code&gt; property), or if something else like the application is making the changes in which case we just want to ignore the change (ie. when zooming to a&amp;#160;specific pin due to a&amp;#160;search).&lt;/p&gt;

&lt;h2&gt;Sample Code&lt;/h2&gt;

&lt;p&gt;I&amp;#8217;ve uploaded a&amp;#160;sample project to Github containing a&amp;#160;very simple implementation of this approach&amp;#8201;&amp;#8212;&amp;#8201;you&amp;#8217;re welcome to clone it, fork it or just read through it:&lt;/p&gt;

&lt;div class="center"&gt;

&lt;p&gt;&lt;a href="http://github.com/tonyarnold/sample-iphonesdk-tapthatmap"&gt;&lt;img src="/workspace/blog-post-resources/xcode_project_icon-1271835753.png" alt="Xcode Project Icon" /&gt;TapThatMap Sample for iPhone &lt;span class="caps"&gt;SDK&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;p&gt;Hopefully this will help someone else looking to achieve the same effect. Currently, tapping the &amp;#8220;&lt;strong&gt;Start Following Me&lt;/strong&gt;&amp;#8221; button does not zoom to and centre on the user&amp;#8217;s location like Apple&amp;#8217;s Maps.app, but otherwise the functionality provided by &lt;code class="prettyprint"&gt;MapKit.framework&lt;/code&gt; should be enough. I&amp;#8217;ll add more to the sample project as I&amp;#160;get time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Campaign Monitor from within your Cocoa&#160;app</title>
      <link>http://tonyarnold.com/post/2052/campaign-monitor-from-within-your-cocoa-app</link>
      <pubDate>Wed, 13 Jan 2010 16:09:00 +1000</pubDate>
      <guid>http://tonyarnold.com/post/2052/campaign-monitor-from-within-your-cocoa-app</guid>
      <description>&lt;p&gt;&lt;em&gt;This is the first of my &amp;#8216;Giving back&amp;#8217; posts. The idea is that I&amp;#8217;ll give something back to this wonderful Cocoa coding community at least once every couple of weeks. I&amp;#160;mean, what&amp;#8217;s the point of going indie if I&amp;#160;can&amp;#8217;t do what I&amp;#160;want once in a&amp;#160;while? :)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="/workspace/blog-post-resources/join_our_mailing_list-1270737084.png" alt="CBMailingListSignup example" /&gt;&lt;/p&gt;

&lt;p&gt;Of all the marketing avenues I&amp;#160;continue to investigate and read about, mailing lists seem to be something that the rest of you recommend time and again. I&amp;#160;missed a&amp;#160;few boats when I&amp;#160;launched &lt;a href="http://thecocoabots.com/hyperspaces/"&gt;Hyperspaces&lt;/a&gt;&amp;#8201;&amp;#8212;&amp;#8201;were I&amp;#160;to do the launch over again, I&amp;#8217;d make sure that a&amp;#160;mailing list was in place and easy to join from my website and within my app. I&amp;#8217;ve always admired the way the &lt;a href="http://panic.com/"&gt;Panic&lt;/a&gt; apps ask you to join their mailing list the first time you start them&amp;#8201;&amp;#8212;&amp;#8201;it&amp;#8217;s simple and unobtrusive.&lt;/p&gt;

&lt;p&gt;As part of my work toward future versions of &lt;a href="http://thecocoabots.com/hyperspaces/"&gt;Hyperspaces&lt;/a&gt;, I&amp;#8217;m looking to do the same. I&amp;#8217;m still deciding which mailing list package/&amp;#8203;provider I&amp;#160;will use in the end, so please don&amp;#8217;t take this as a &amp;#8220;this is what The CocoaBots use&amp;#8221; post, however I&amp;#160;did meet the &lt;a href="http://campaignmonitor.com/"&gt;Campaign Monitor&lt;/a&gt; guys at &lt;a href="http://wds09.webdirections.org/"&gt;Web Directions South &lt;span class="numbers"&gt;09&lt;/span&gt;&lt;/a&gt;, and their product has a&amp;#160;nice web service &lt;span class="caps"&gt;API&lt;/span&gt;. So I&amp;#160;put together a&amp;#160;small example project that will sign a&amp;#160;user up to your Campaign Monitor mailing list from directly within your&amp;#160;app.&lt;/p&gt;

&lt;p&gt;The code is heavily inspired by Uli&amp;#8217;s &lt;a href="http://zathras.de/angelweb/sourcecode.htm"&gt;UKCrashReporter&lt;/a&gt; and Wolf&amp;#8217;s &lt;a href="http://github.com/rentzsch/jrfeedbackprovider/"&gt;JRFeedbackProvider&lt;/a&gt; projects (this is like a&amp;#160;mutant offspring of the two). I&amp;#160;may not end up using it in my apps, but hopefully someone else finds it useful.&lt;/p&gt;

&lt;p&gt;The GitHub project is at &lt;a href="http://github.com/tonyarnold/CBMailingListSignup/"&gt;http://&amp;#8203;github&amp;#8203;.com/&amp;#8203;t&amp;#8203;o&amp;#8203;n&amp;#8203;y&amp;#8203;a&amp;#8203;r&amp;#8203;n&amp;#8203;o&amp;#8203;l&amp;#8203;d&amp;#8203;/&amp;#8203;C&amp;#8203;B&amp;#8203;M&amp;#8203;a&amp;#8203;i&amp;#8203;l&amp;#8203;i&amp;#8203;n&amp;#8203;g&amp;#8203;L&amp;#8203;i&amp;#8203;s&amp;#8203;t&amp;#8203;S&amp;#8203;ignup&lt;/a&gt;, and the code is licensed under the &lt;a href="http://creativecommons.org/licenses/by/2.5/au/"&gt;Creative Commons Attribution &lt;span class="numbers"&gt;2&lt;/span&gt;.&lt;span class="numbers"&gt;5&lt;/span&gt; Australia License&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hyperspaces 1.0 and The CocoaBots</title>
      <link>http://tonyarnold.com/post/2051/hyperspaces-10-and-the-cocoabots</link>
      <pubDate>Tue, 15 Dec 2009 12:42:00 +1000</pubDate>
      <guid>http://tonyarnold.com/post/2051/hyperspaces-10-and-the-cocoabots</guid>
      <description>&lt;p&gt;There&amp;#8217;s more about this over at the &lt;a href="http://thecocoabots.com/blog/"&gt;new CocoaBots blog&lt;/a&gt;, but I&amp;#160;just launched &lt;a href="http://thecocoabots.com/hyperspaces/"&gt;Hyperspaces &lt;span class="numbers"&gt;1&lt;/span&gt;.&lt;span class="numbers"&gt;0&lt;/span&gt;&lt;/a&gt;. Further to that, &lt;a href="http://thecocoabots.com/blog/"&gt;The CocoaBots&lt;/a&gt; is now a&amp;#160;full-&amp;#8203;time venture&amp;#8201;&amp;#8212;&amp;#8201;check out the new site for more&amp;#160;info!&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ll put together a&amp;#160;post about going indie soon (I promise!) but for now all I&amp;#160;can say is that I&amp;#160;love it!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Core Animation uses a&#160;lot of memory</title>
      <link>http://tonyarnold.com/post/2050/core-animation-uses-a-lot-of-memory</link>
      <pubDate>Sun, 23 Aug 2009 22:22:00 +1000</pubDate>
      <guid>http://tonyarnold.com/post/2050/core-animation-uses-a-lot-of-memory</guid>
      <description>&lt;p&gt;Here&amp;#8217;s something Apple should probably put on the box when they sell Core Animation to new developers: It uses a&amp;#160;&lt;em&gt;lot&lt;/em&gt; of &lt;span class="caps"&gt;RAM&lt;/span&gt;. Before you dive in with both feet, you need to ask whether the features you get from Core Animation will really be worth the overhead.&lt;/p&gt;

&lt;p&gt;In &lt;a href="http://hyperspacesapp.com/"&gt;Hyperspaces&lt;/a&gt;, if you&amp;#8217;re running on a&amp;#160;single monitor set-&amp;#8203;up, you&amp;#8217;ll generally see &lt;span class="caps"&gt;RAM&lt;/span&gt; usage around the &lt;span class="numbers"&gt;60&lt;/span&gt;-&amp;#8203;&lt;span class="numbers"&gt;100&lt;/span&gt;Mb mark (&lt;span class="caps"&gt;RSIZE&lt;/span&gt;). Two screens, you&amp;#8217;re going straight beyond the &lt;span class="numbers"&gt;100&lt;/span&gt;Mb mark. I&amp;#160;assume it grows exponentially from there, but I&amp;#8217;ve no machines on hand that will drive more than &lt;span class="numbers"&gt;2&lt;/span&gt;&amp;#160;screens (&lt;em&gt;Update:&lt;/em&gt; I&amp;#160;assume wrong&amp;#8201;&amp;#8212;&amp;#8201;the caching is pretty good for CGImageRefs and their ilk. It won&amp;#8217;t grow exponentially).&lt;/p&gt;

&lt;p&gt;On a&amp;#160;single monitor set-&amp;#8203;up, there are two layer-&amp;#8203;backed views&amp;#8201;&amp;#8212;&amp;#8201;one screen-&amp;#8203;size view that sits behind your desktop icons, and one smaller view that contains the switcher. If I&amp;#160;run up Hyperspaces without either of my layer-&amp;#8203;backed views enabled, the application uses &lt;span class="numbers"&gt;13&lt;/span&gt;Mb &lt;span class="caps"&gt;RAM&lt;/span&gt;&amp;#8201;&amp;#8212;&amp;#8201;so the core (for what it does) is quite compact. If I&amp;#160;re-&amp;#8203;enable the layer-&amp;#8203;backed switcher window, memory usage instantly jumps to &lt;span class="numbers"&gt;56&lt;/span&gt;Mb&amp;#8201;&amp;#8212;&amp;#8201;the switcher is usually about &lt;span class="numbers"&gt;500&lt;/span&gt;&amp;#8201;&amp;#8212;&amp;#8201;&lt;span class="numbers"&gt;600&lt;/span&gt;px wide, and about &lt;span class="numbers"&gt;100&lt;/span&gt;px high (with &lt;span class="numbers"&gt;3&lt;/span&gt;&amp;#160;spaces enabled).&lt;/p&gt;

&lt;p&gt;I have spent &lt;em&gt;months&lt;/em&gt; trying to bring this number down by any means possible. So far, I&amp;#8217;ve tried:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cropping and chopping my &lt;a href="http://developer.apple.com/documentation/graphicsimaging/reference/CGImage/Reference/reference.html"&gt;CGImageRef&lt;/a&gt; objects down to only exactly what&amp;#8217;s needed for display;&lt;/li&gt;
&lt;li&gt;Aggressively caching and uncaching &lt;a href="http://developer.apple.com/documentation/graphicsimaging/reference/CGImage/Reference/reference.html"&gt;CGImageRef&lt;/a&gt; objects (thanks go out to &lt;a href="http://seanpatrickobrien.com/"&gt;Sean O&amp;#8217;Brien&lt;/a&gt; for helping me with&amp;#160;that);&lt;/li&gt;
&lt;li&gt;Storing only the &lt;a href="http://developer.apple.com/documentation/graphicsimaging/Reference/CGImageSource/index.html"&gt;CGImageSourceRef&lt;/a&gt; for each of my images and explicitly telling those sources not to cache their &lt;a href="http://developer.apple.com/documentation/graphicsimaging/reference/CGImage/Reference/reference.html"&gt;CGImageRefs&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Saving those cropped and chopped &lt;a href="http://developer.apple.com/documentation/graphicsimaging/reference/CGImage/Reference/reference.html"&gt;CGImageRef&lt;/a&gt; objects out to cached &lt;span class="caps"&gt;JPEG&lt;span class="numbers"&gt;2000&lt;/span&gt;&lt;/span&gt; files and then reading those files back into cached &lt;a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/index.html"&gt;NSData&lt;/a&gt; objects to be decoded when needed;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There are probably other things I&amp;#8217;ve tried that have worked to varying degrees, but those items above are the ones that made a&amp;#160;difference. They don&amp;#8217;t solve the problem.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re writing a&amp;#160;background application that you expect your users to have open all the time, you (unfortunately) will need to think very carefully about whether you should use Core Animation in your application. I&amp;#8217;ve had feedback from users of &lt;a href="http://hyperspacesapp.com/"&gt;Hyperspaces&lt;/a&gt; that they would prefer to leave the animation in&amp;#8201;&amp;#8212;&amp;#8201;while I&amp;#160;pitch &lt;a href="http://hyperspacesapp.com/"&gt;Hyperspaces&lt;/a&gt; as a&amp;#160;tool that provides context to Apple&amp;#8217;s Spaces, I&amp;#8217;m pretty sure a&amp;#160;lot of the users are more into the eye candy and the softly fading desktop images :)&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve certainly asked for advice about this issue in a&amp;#160;few different places, as well as done my research&amp;#8201;&amp;#8212;&amp;#8201;and I&amp;#8217;d be very happy to be proven wrong (please?!).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Get Satisfaction for user support&#8201;&#8212;&#8201;does it&#160;work?</title>
      <link>http://tonyarnold.com/post/2049/get-satisfaction-for-user-support-does-it-work</link>
      <pubDate>Thu, 16 Jul 2009 22:17:00 +1000</pubDate>
      <guid>http://tonyarnold.com/post/2049/get-satisfaction-for-user-support-does-it-work</guid>
      <description>&lt;p&gt;For the past few months, I&amp;#8217;ve been using the free version of &lt;a href="http://getsatisfaction.com/"&gt;Get Satisfaction&lt;/a&gt; to manage end-&amp;#8203;user support for &lt;a href="http://thecocoabots.com/hyperspaces/"&gt;Hyperspaces&lt;/a&gt;, and I&amp;#160;thought it was time to write a&amp;#160;bit of a&amp;#160;retrospective. I&amp;#160;want to start by saying that I&amp;#160;don&amp;#8217;t think there is a&amp;#160;perfect answer to user support&amp;#8201;&amp;#8212;&amp;#8201;people are funny creatures, and they tend to want help on their own terms. This usually means that a&amp;#160;tool like &lt;a href="http://redmine.org/"&gt;Redmine&lt;/a&gt; (which I&amp;#160;absolutely &lt;strong&gt;love&lt;/strong&gt; for my development and product testing) is going to annoy the hell out of your Mum &lt;span class="amp"&gt;&amp;#38;&lt;/span&gt; Pop software users (what&amp;#8217;s a &amp;#8216;milestone&amp;#8217;, and why do I&amp;#160;care?).&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve been through a&amp;#160;few different products over the years, including &lt;a href="http://sourceforge.net/"&gt;Sourceforge&lt;/a&gt;, &lt;a href="http://trac.edgewall.com/"&gt;Trac&lt;/a&gt; and &lt;a href="http://redmine.org/"&gt;Redmine&lt;/a&gt;&amp;#8201;&amp;#8212;&amp;#8201;all of which were and are brilliant, but far too focused on development. Finally, around &lt;span class="numbers"&gt;12&lt;/span&gt; months ago, I&amp;#160;started looking elsewhere for my user support&amp;#8201;&amp;#8212;&amp;#8201;&amp;#8220;Surely there&amp;#8217;s something better!&amp;#8221; I&amp;#160;told myself. Thankfully, there was: &lt;a href="http://getsatisfaction.com/"&gt;Get Satisfaction&lt;/a&gt;. From &lt;a href="http://en.wikipedia.org/wiki/Get_Satisfaction"&gt;Wikipedia&amp;#8217;s description of Get Satisfaction&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;The company describes its product as &amp;#8220;people-&amp;#8203;powered customer service&amp;#8221;. On the website, anyone can ask a&amp;#160;question, submit an idea or complaint, or give praise; all posts can be read by anyone. Companies can respond to issues regarding their products or services; official responses are marked as official answers to separate them from other responses. Users can rate responses based on how well they resolve the&amp;#160;issue.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I started seriously looking at &lt;a href="http://getsatisfaction.com/"&gt;Get Satisfaction&lt;/a&gt; around May last year, and at the time I&amp;#160;was very impressed. When I&amp;#160;publicly launched &lt;a href="http://thecocoabots.com/hyperspaces/"&gt;Hyperspaces&lt;/a&gt; earlier this year, there was a&amp;#160;&lt;a href="http://getsatisfaction.com/thecocoabots/products/thecocoabots_hyperspaces"&gt;Get Satisfaction page for it on launch day&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And for a&amp;#160;time, it was great&amp;#8201;&amp;#8212;&amp;#8201;I&amp;#8217;m a&amp;#160;big believer in being hands on and communicative. If there&amp;#8217;s a&amp;#160;problem with my product, I&amp;#160;take care to publicly acknowledge that I&amp;#8217;ve got the message even if I&amp;#160;have no idea how to fix it yet. I&amp;#160;did that&amp;#8201;&amp;#8212;&amp;#8201;I&amp;#160;answered, and answered and answered. I&amp;#160;think my users appreciated it.&amp;#160;w&lt;span class="numbers"&gt;00&lt;/span&gt;t!&lt;/p&gt;

&lt;p&gt;Then the clouds started to&amp;#160;form.&lt;/p&gt;

&lt;p&gt;With more questions being posted, the page started getting really messy, and I&amp;#160;honestly believe quite hard to use. The interface now seemed cluttered and obstructive rather than helpful, and I&amp;#160;was getting lots of duplicate questions&amp;#8201;&amp;#8212;&amp;#8201;&amp;#8220;this isn&amp;#8217;t working how it&amp;#8217;s supposed to&amp;#8221;. I&amp;#8217;m a&amp;#160;developer, not a&amp;#160;user of my product, so I&amp;#160;don&amp;#8217;t pretend that I&amp;#160;always know what mine are thinking, but surely this wasn&amp;#8217;t an easy way to get an answer to your question?&lt;/p&gt;

&lt;p&gt;I am at the point now where I&amp;#160;am seriously reviewing other options for user support. The problem is, I&amp;#8217;m yet to find something that&amp;#8217;s as simple&amp;#8201;&amp;#8212;&amp;#8201;and more importantly, free&amp;#8201;&amp;#8212;&amp;#8201;as &lt;a href="http://getsatisfaction.com/"&gt;Get Satisfaction&lt;/a&gt;. &lt;a href="http://tenderapp.com/"&gt;entp&amp;#8217;s Tender&lt;/a&gt; looks really, really nice&amp;#8201;&amp;#8212;&amp;#8201;but it&amp;#8217;s expensive for&amp;#160;me.&lt;/p&gt;

&lt;p&gt;To complicate matters further, &lt;a href="http://getsatisfaction.com/"&gt;Get Satisfaction&lt;/a&gt; has just released version &lt;span class="numbers"&gt;2&lt;/span&gt;.&lt;span class="numbers"&gt;0&lt;/span&gt; of their site. The company overview is now a&amp;#160;fantastic layout&amp;#8201;&amp;#8212;&amp;#8201;nice, simple and straight-&amp;#8203;forward. It&amp;#8217;s categorised and visually sorted. The product pages aren&amp;#8217;t so lucky&amp;#8201;&amp;#8212;&amp;#8201;they&amp;#8217;re still a&amp;#160;formless mess, and I&amp;#160;have a&amp;#160;hard time understanding why there&amp;#8217;s not &lt;strong&gt;some&lt;/strong&gt; structure to&amp;#160;them.&lt;/p&gt;

&lt;h2&gt;Company Overview&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://farm3.static.flickr.com/2423/3725821905_ba0967d880_o.jpg"&gt;&lt;img src="/workspace/blog-post-resources/3725821905_ba0967d880_o-1270708787.jpg" alt="GetSatisfaction: CocoaBots Support Page" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Product Support&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://farm4.static.flickr.com/3458/3725821619_a195a75060_o.jpg"&gt;&lt;img src="/workspace/blog-post-resources/3725821619_a195a75060_o-1270708788.jpg" alt="GetSatisfaction: Hyperspaces Support Page" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ll keep this post updated with what I&amp;#160;decide to do, but right now I&amp;#8217;m seriously weighing up whether it&amp;#8217;s worth pouring some of the money I&amp;#8217;ve made from &lt;a href="http://thecocoabots.com/hyperspaces/"&gt;Hyperspaces&lt;/a&gt; into a&amp;#160;really good support package from somewhere like &lt;a href="http://entp.com/"&gt;entp&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Testing testers</title>
      <link>http://tonyarnold.com/post/2048/testing-testers</link>
      <pubDate>Thu, 02 Jul 2009 21:01:00 +1000</pubDate>
      <guid>http://tonyarnold.com/post/2048/testing-testers</guid>
      <description>&lt;p&gt;&lt;img src="/workspace/blog-post-resources/bottlejacks-1270708404.jpg" alt="Bottle jacks header image" /&gt;&lt;/p&gt;

&lt;p&gt;One of the challenges most independent developers will face is finding good testers for their applications. I&amp;#8217;ve been relatively lucky with &lt;a href="http://hyperspacesapp.com/"&gt;Hyperspaces&lt;/a&gt;&amp;#8201;&amp;#8212;&amp;#8201;my users tend to take the time to tell me what&amp;#8217;s going on when they submit a&amp;#160;crash report, or start a&amp;#160;new conversation on &lt;a href="http://getsatisfaction.com/thecocoabots/"&gt;GetSatisfaction&lt;/a&gt;. What I&amp;#160;have had troubles with is finding enough people willing to help test upcoming releases&amp;#8201;&amp;#8212;&amp;#8201;right now, I&amp;#160;have &lt;a href="http://getsatisfaction.com/thecocoabots/topics/test_build_of_hyperspaces_1_0_beta_8_is_available"&gt;a&amp;#160;great new release of Hyperspaces&lt;/a&gt; ready for a&amp;#160;few keen souls to try out, but nobody has downloaded it! If you&amp;#8217;re a&amp;#160;user&amp;#8201;&amp;#8212;&amp;#8201;please&amp;#8201;&amp;#8212;&amp;#8201;give it a&amp;#160;go, let me know what you find. If you&amp;#8217;re a&amp;#160;developer, read&amp;#160;on&amp;#8230;&lt;/p&gt;

&lt;p&gt;So what do other independent developers do in this situation? My tests (unit and functional) tell me that the release is &lt;span class="caps"&gt;OK&lt;/span&gt;, but after some earlier mishaps I&amp;#8217;m much more cautious about just throwing out a&amp;#160;new update via &lt;a href="http://sparkle.andymatuschak.org/"&gt;Sparkle&lt;/a&gt;. I&amp;#160;don&amp;#8217;t have the money to spend on hordes of formal testers, and I&amp;#8217;m pretty sure people do actually use and love my app&amp;#8201;&amp;#8212;&amp;#8201;is it right to harness that goodwill for my testing purposes? Or should I&amp;#160;just be saving up to pay some testers? What&amp;#8217;s a&amp;#160;reasonable amount? Questions, questions, questions&amp;#8230;&lt;/p&gt;</description>
    </item>
    <item>
      <title>CATiledLayers are&#160;fun</title>
      <link>http://tonyarnold.com/post/2047/catiledlayers-are-fun</link>
      <pubDate>Sat, 04 Apr 2009 01:03:00 +1000</pubDate>
      <guid>http://tonyarnold.com/post/2047/catiledlayers-are-fun</guid>
      <description>&lt;p&gt;One of the big issues I&amp;#8217;m trying to address for &lt;a href="http://thecocoabots.com/hyperspaces/"&gt;Hyperspaces&lt;/a&gt; &lt;span class="numbers"&gt;1&lt;/span&gt;.&lt;span class="numbers"&gt;0&lt;/span&gt; is related to video memory:&lt;/p&gt;

&lt;p&gt;Core Animation likes to cache any imagery you insert into a&amp;#160;layer onto the user&amp;#8217;s graphics card, which is fantastic when you&amp;#8217;re running on a&amp;#160;machine with more than &lt;span class="numbers"&gt;256&lt;/span&gt;Mb &lt;span class="caps"&gt;VRAM&lt;/span&gt;&amp;#8201;&amp;#8212;&amp;#8201;things are smooth as silk and you get great fades between changes. Unfortunately, for users running on Macs that don&amp;#8217;t have that much &lt;span class="caps"&gt;VRAM&lt;/span&gt; there is a&amp;#160;big problem&amp;#8201;&amp;#8212;&amp;#8201;if the image you load into the layer is too big to fit into &lt;span class="caps"&gt;VRAM&lt;/span&gt;, Core Animation just doesn&amp;#8217;t draw it. White backgrounds for the&amp;#160;win.&lt;/p&gt;

&lt;p&gt;Apple&amp;#8217;s answer to this problem is the &lt;code class="prettyprint"&gt;CATiledLayer&lt;/code&gt;. Basically, it allows you divide a&amp;#160;much larger image into smaller chunks that &lt;em&gt;can&lt;/em&gt; be cached on older video cards. For &lt;a href="http://thecocoabots.com/hyperspaces/"&gt;Hyperspaces&lt;/a&gt;, I&amp;#8217;m working on replicating the drawing styles of the standard Mac &lt;span class="caps"&gt;OS&lt;/span&gt; X&amp;#160;desktop background&amp;#8201;&amp;#8212;&amp;#8201;&amp;#8220;Fit To Screen&amp;#8221;, &amp;#8220;Fill Screen&amp;#8221;, &amp;#8220;Stretch To Fill Screen&amp;#8221;, &amp;#8220;Center&amp;#8221; and &amp;#8220;Tile&amp;#8221;. Tiled desktops are fine&amp;#8201;&amp;#8212;&amp;#8201;I&amp;#8217;m rendering those using a&amp;#160;&lt;code class="prettyprint"&gt;CATiledLayer&lt;/code&gt; in the build you&amp;#8217;re all using right now (&lt;span class="numbers"&gt;1&lt;/span&gt;.&lt;span class="numbers"&gt;0&lt;/span&gt;fc&lt;span class="numbers"&gt;4&lt;/span&gt;).&lt;/p&gt;

&lt;p&gt;What&amp;#8217;s interesting though is what happens when I&amp;#160;play lazy programmer:&lt;/p&gt;

&lt;p&gt;&lt;object width="590" height="375"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=3987685&amp;#38;server=vimeo.com&amp;#38;show_title=1&amp;#38;show_byline=1&amp;#38;show_portrait=0&amp;#38;color=&amp;#38;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=3987685&amp;#38;server=vimeo.com&amp;#38;show_title=1&amp;#38;show_byline=1&amp;#38;show_portrait=0&amp;#38;color=&amp;#38;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="590" height="375"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;

&lt;p&gt;Lovely, no? It would be a&amp;#160;cool effect with a&amp;#160;longer fade, and if I&amp;#160;weren&amp;#8217;t already getting complaints about how slow &lt;a href="http://thecocoabots.com/hyperspaces/"&gt;Hyperspaces&lt;/a&gt; is to change desktop backgrounds right now. I&amp;#8217;m still working on the final code&amp;#8201;&amp;#8212;&amp;#8201;I&amp;#8217;ll post it when it&amp;#8217;s done for reference&amp;#8201;&amp;#8212;&amp;#8201;but the simple answer to this problem is twofold:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Make the tiles as large as you can&lt;/em&gt;&amp;#8201;&amp;#8212;&amp;#8201;this isn&amp;#8217;t too tricky. Apple defaults this to &lt;span class="numbers"&gt;256&lt;/span&gt;px by &lt;span class="numbers"&gt;256&lt;/span&gt;px, but I&amp;#160;haven&amp;#8217;t done enough research to know what&amp;#8217;s reasonable&amp;#8201;&amp;#8212;&amp;#8201;it&amp;#8217;s really going to be based upon your target audience, and whether they have decent graphics cards or&amp;#160;not;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Cache the &amp;#8220;sliced&amp;#8221; image pieces&lt;/em&gt;&amp;#8201;&amp;#8212;&amp;#8201;the video you see above is the result of me slicing a&amp;#160;&lt;code class="prettyprint"&gt;CGImageRef&lt;/code&gt; up in real&amp;#160;time;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope you enjoy the (unintended) effect!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Me too, me&#160;too!</title>
      <link>http://tonyarnold.com/post/2046/me-too-me-too</link>
      <pubDate>Sun, 15 Mar 2009 11:48:00 +1000</pubDate>
      <guid>http://tonyarnold.com/post/2046/me-too-me-too</guid>
      <description>&lt;p&gt;Filed under the most daring display of &lt;span class="caps"&gt;FUD&lt;/span&gt; and stopwatch timing this week: &lt;a href="http://arstechnica.com/microsoft/news/2009/03/microsofts-own-speed-tests-show-ie-beating-chrome-firefox.ars"&gt;Microsoft&amp;#8217;s own speed tests show &lt;span class="caps"&gt;IE&lt;/span&gt; beating Chrome, Firefox&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Riiiiiight.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
