An NSNumber
is an object, an int is a primitive value. You can box up a primitive into an NSNumber.
You might do this if you want to convert the int to a float or other primitive type, or because you need an object representation of the primitive value. Some classes like NSDictionary won't let you use primitive values as their keys, for example.
@5 is a shorthand for [NSNumber numberWithInt:5]
and you can read more about literals on NSHipster. It is completely safe and designed to make your code quicker to type and easier to read!
NSCFNumber is the class Apple actually use to implement NSNumber behind the scenes, as part of what's known as a class cluster. At this stage, you don't need to worry about it.