Коротко и просто: да, вы должны помнить это для каждого типа, но это будет очень естественно через некоторое время.
Вопрос не столько в том, «какой NSSomething является значением, а какой является объектом» (точнее: какой NSSomething является скалярным типом данных или структурой, а какой - классом). Даже если вы не увидите и не будете использовать объявления вроде:
NSRect *pointerToARect;
NSInteger *pointerToAnInteger;
очень часто, они идеально подходят и время от времени необходимы. Таким образом, для скаляров (простых типов данных, таких как NSInteger) и структур, оба варианта являются действительными, и какой вариант вы используете, зависит от того, нужен ли вам указатель или фактическая вещь.
В случае объектов все ваши переменные всегда должны быть указателями, поскольку объекты можно размещать только в куче, а не в стеке. Так что в отличие от приведенных выше примеров, это:
NSValue myValue; // invalid!
неверно и не будет компилироваться.