#2: I chose to avoid returning an array out of frustration with the retain/release system-- Although I understand the concept of how it works, enough things happen behind the scenes that I'm not confident about having the correct reference count when I go to delete an object. (questions at end)
If you're thinking about reference count, you're doing it wrong. Seriously. You should be thinking about ownership: Do I own this object at this point? If I don't own it, how do I claim ownership? If I do own it, what are my responsibilities at this point?
Read the Memory Management Guide, and memorize the basic rules of ownership.
http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html
Ownership is the fundamental principle behind memory management, and memory management is fundamental to every correctly working program. If you don't have a solid grasp of the fundamentals, then you're already beyond your skill level.
* Is there a way to print/view the current retain reference count of an object?
There is, but it almost always leads you astray. Because reference count doesn't directly indicate
your ownership. It could be someone else's ownership, and you believe things are fine when they're not.
* Is there a way to free memory regardless of the reference count?
Why would you do that?
The reference count indicates the total of all ownership claims. If you free the object, you are revoking all ownership claims,, whether you know who the owners are or not, and whether you know what their ownership means or not.
Take care of your own claims of ownership, and let other's claims take care of themselves.
* Does the redundancy of the select/data check cause a problem? (The code will be changed regardless)
Does
any redundant code cause a problem?
It might. For one thing, it's redundant. For another, it's entirely redundant. And thirdly, it's completely redundant. If the needless verbosity and logical conditions embodied in the superfluous redundancy isn't an immediate problem, it could become one as the code changes over time. Redundant code must be maintained (all code is subject to bugs being introduced; the more code you have, the more places for bugs to be introduced). Immediate problems may include subtle bugs (typically in the scope of a redundant conditional block), inefficiency (unnecessary checks and conditionals), unecessary code size (redundant code is still code), and a general absence of clarity for those who read the code. Reading redundant code always makes me wonder whether the redundancy was intentional or whether it's actually a latent bug that's testing the wrong condition, and then what the correct condition might actually be.
If you want to code in failsafes, then use assertions. The C assert() function works, as does NSAssert. You can google them. If you don't know what assertions are and why you'd use them, there's a page for that:
http://en.wikipedia.org/wiki/Assertion_(computing)