Well, the reason of category vs inheiritance is mostly a semantics one. However, there is a good rule of thumb that I use:
If you are adding functions, but not data, use a category. An example of this is adding functions to NSMutableData which allow you to remove X bytes from a section of the data, or remove all BUT X bytes from the data. It doesn't make sense to create an entire sub-class simply to add these two functions, nor does it makes sense to write functions that aren't attached to a class (a plain C function). This allows you to attach the functionality to the class without creating a new, uneeded relationship, and doesn't change any part of existing functionality.
If you need to add/change data and add functionality to manipulate that data, or change functionality to represent a sub-type of object in your controller model, then you sub-class. For example, NSMutableData is a sub-class because it still uses NSData accessors, however, it changes the data representation internally so it can also manipulate the data. In this case a sub-class makes sense because it is no longer NSData, it is a /mutable/ NSData object (new keyword added to describe the object).
Another way to look at this: Do you describe it as a <insert adj> <insert type> object? Or do you describe it as a <insert type> object with X functionality?
Examples:
Mutable NSData object -> NSMutableData subclass of NSData
NSData object with range extraction -> NSData category (range_extraction)
Ford Truck object -> NSFordTruck subclass of NSTruck
Ford Truck object with reclining seats -> NSFordTruck category (reclining_seats)
Also, categories are the only way to implement private functions (declaring them in the .m file instead of the header.
Hopefully this helps? I tried to approach it a few different ways and type until I couldn't think of any other ways to say it. Mostly so that if one way of looking at it is a little odd, another might make more sense.