@class is called a forward declaration and indicates you'd like to use the type, but not have any interface details present (ie. you don't know it's methods and properties).
#import is a preprocessor statement (very similar to #include) and at compile time it is replaced with the contents of the file you're importing, and you have access to the type and it's interface (ie. you will know it's methods and properties).
The difference between the two is how much information you want to pass on to code that is using your class.
Examples:
Use @class when declaring private ivars in the .h file. Pair it up with a #import statement in the .m. This will speed up compilation and it does help with code readability.
Use #import in the .h file when the details of the type's interface is needed to use your class. This is why you must #import prototypes, because you need to know the interface details for the compiler to know if you're implementing the required methods.
You also want to #import superclasses because it's interface details are required for polymorphism.