Archive for December, 2011

retainCount is useless.

Sunday, December 18th, 2011

The retainCount method just isn’t very useful as has been indicated in the answers to about a zillion StackOverflow questions.

The documentation has this to say:

Important: This method is typically of no value in debugging memory management issues. Because any number of framework objects may have retained an object in order to hold references to it, while at the same time autorelease pools may be holding any number of deferred releases on an object, it is very unlikely that you can get useful information from this method.

Makes it pretty clear that you shouldn’t be calling retainCount, but it really doesn’t illuminate exactly how useless the method is outside of a very narrow context.

So, let us count the ways:

  1. The absolute retain count of an object may change at any time once an object has been passed through any system API.
  2. Any subclass of any system provided class counts as “through system API”; the retain count may be impacted by implementation details.
  3. The retain count never reflects whether an object is autoreleased.
  4. Autorelease is a per-thread concept whereas retain counts are global; race condition derived hilarity can easily ensue.
  5. The retainCount method can never return 0.
  6. Some classes are implemented as singletons some of the time.
  7. Some classes may internally manipulate their retain count directly (I.e. no swizzle for you!).
  8. While retain/release are effectively thread safe, there is always a race between calling retainCount and having the actual retain count change in some other execution context.

Bottom line: the only time the absolute retainCount can be conclusively used for analytic purposes is if you have the backtrace of every retain and release that contributed to the current retain count’s value (there is another use case, documented at the end). If you have that, then you don’t need the retain count and, fortunately, Instruments is already generally quite adept at producing a per-object inventory of retains and releases for you (see Analyzing Data with the Allocations Instrument“.

In general, you should consider the retain count as a delta. Your code causes the retain count to increase and decrease. You don’t +alloc an object with a retain count of 1. Instead, you +alloc an object with a retain count of +1. If you want that object to go away, you need to do something — release, always and eventually — that causes the retain count to be decremented by 1.

It really is that simple.


Concurrency — whether through threading or GCD — throws a bit of a wrench in the works (as it always does). Namely, the retain count should really be considered as a per concurrency context delta. If thread or queue A wants to do something with object X, it should hold a +1 retainCount on X for the duration of said operation. One subtle detail that will bear repeating later; an autorelease‘d object does not contribute to thread safety. That is, if thread or queue A wants to pass X to thread or queue B, there must be an explicit retain in A that is balanced by a release (or synchronization event back to A) in B.

Now, some of the enumerated claims may either seem specious at best or, certainly, not obvious as to exactly how it undermines the validity of the retain count. Read the rest of this entry »

Aerogarden Success!

Saturday, December 17th, 2011

This is our AeroGarden after a couple of months of growth. It is currently growing savory, mint, basil, thyme, parsley, amaranth, and oregano. The Aero works really really well. Within the water reservoir (the big black thing under the plants), it has a pump that pumps water with nutrients over the roots of the little growing pods that stick through the holes in the deck around the plants. Surprisingly, the thing makes virtually no noise.

Once every week to 14 days (not sure how often), it reminds you to add nutrients and it has a water-low indicator. While the seed kits from Aero include nutrients, I’ve been using the worm tea from my son’s worm farm.

Quite nice to have a nearly non-stop supply of fresh herbs next to the kitchen!

I would never have otherwise bought such a device, but we ran across one at a garage sale for $5. Quite a hefty discount off of the $150 new price. It did need some new lights.

I picked up one of the Aero branded seed packets so I could go through one grow cycle by the book, as it were.

$150 seems a bit steep and seed kits are another $20, typically. However, if you truly will use all the herbs, then I would think the thing would pay for itself long before it wears out. Annoyingly, the light sockets are of an esoteric standard and ordering new lamps from Aero is ridiculously pricy. Razor meet blades, assuredly. However, it isn’t hard to rewire it for standard CFL grow lamps (you want CFL to avoid burning the plants at such close proximity).

Read the rest of this entry »

Eichler Ornament

Saturday, December 17th, 2011
Ornament On Tree
In Action

Every year, our neighborhood has an annual ornament exchange.

This year, we hosted the party at our house.

For our ornament, I picked up a bunch of matte finished shatterproof (i.e. plastic) ornaments from and shoved ’em in EMSL’s Egg-Bot.

For the artwork, I found an elevation illustration of the front of a typical Eichler and used Inkscape to trace a relatively minimal line drawing of the elevation (attached below).

Worked great! The person that received their ornament loved it and, of course, then everyone else wanted one, too. No problem! I printed ’em up in whatever color combinations folks wanted.

When loaded in Inkscape, the lettering and wreath on the door are in a different layer than the house line art. The Egg-Bot Inkscape driver makes it easy to print a layer at a time and, because the stepper motors stay powered unless you explicitly turn them off, you can easily swap pens after a layer is printed without knocking things out of alignment.

If you have an Egg-Bot, those particular ornaments + Sharpie ultra-fine markers are pretty much an optimal combination. You don’t even need to take the little hanger top off when printing. As can be seen in the photo on the left, the ornament part fits well into the cup of the egg holder and the plastic eye is held quite firmly by the spring loaded part of the Egg-Bot’s egg holder.

Eichler SVG