The reason Apple prefers you to extern constants is because it allows you to more easily share them outside of the project, which is important if you are building a framework or library, especially in the case of notifications, etc. If the constant can be represented with an enum then YES, do this, but in the case of strings, the preprocessor macro will undergo a replacement before compiling, at which time the string literal will get put into a static const NSString* anyway with all the same built in cacheing. In most cases I find macros to be much easier to use. Starting constants with a k comes from the German spelling of constant and just feels out of place for my tastes.