I've been following this basic model for skin parts: http://opensource.adobe.com/wiki/display/flexsdk/Spark+Skinning by carefully making sure to remove any event listeners in partRemoved that were added in partAdded. But in testing, it seems that if I skip this, the component will still be properly GC'ed. Is this a necessary/recommended step, or am I wasting time with that?
It is only necessary if those skin parts will be removed without destroying the host component. If the host component is removed and all the references cleared, then all of it's children will be GCd as well (including skin parts).
Maybe this link will provide some additional insight: http://www.adobe.com/devnet/flex/articles/dynamic_skin_parts.html
A listener creates a reference from the dispatcher to the handler, so a host
listening to a skin part creates a reference from the skin to the host.
When changing skins, once the host has removed all references to the skin,
it is available for GC because the listener is not an additional reference.
So, is removing the host listeners to a skin "required" for a removed skin
to get GC'd? No, even if the host is staying around. It is a good habit to
get into though. Someday you'll add a listener in some other code to some
other object that does matter.