What you describe seems to suggest a question more about software design than about programming. To that end, I've found the best way to learn design paradigms, especially early on, is to consume good design. If you'd like to learn about OO design paradigms, write software that uses a high quality OO framework. Both the Java and .Net libraries are examples. Because I suspect you're actually more interested in the appropriate design methods for Objective C, consume the ones provided by Apple to learn how things are done and why they're done that way.
Eventually, with practice and experience, you'll begin to develop an intuition for design that captures higher level concepts such as dependencies, coupling and cohesion. Then it can be very valuable to read about some of the abstract design principles and apply them to your own code. Look at something you wrote six months ago. What do you like? What don't you like? What would you do differently?
This is essentially the act of developing any professional skill:
Execute => Critique => Distill the
lesson => Apply the lesson => Repeat.
I think the most critical point is that you not get bogged down too deeply early on, learning doesn't happen when you're stuck in the middle of analysis paralysis. Instead, try something (using a good source repository, of course). If it blows up, you have a snapshot back where you started so you can apply the lessons and try again.
Ultimately, in the world of OO, I'd suggest a couple of core best practices to get you started:
Avoid circular dependencies. If you have two objects that depend on each other, you've probably done something wrong. (There are exceptions, of course, but you shouldn't be using this technique at a beginning level.)
Isolate the implementation from the contract. Maintain two separate concepts in your mind between "what" an object does and "how" it does it. I don't know Objective C, so I don't know what particular abstraction your language exposes this with. In C++ you can specify the contract with a purely virtual abstract base class. C# does so with an interface
. If you are able to reason about the "what" (the contract) separately from the "how" (the implementation), you'll have an easier time creating functional, high quality software (in my experience).