#define or NSString * const - Benefits and drawbacks of string literal constant syntax?
Actually, they are completely equal (obviously sans the extern keyword on the constant define).  When literal strings are declared @"", the compiler expands them out to a compile-time constant expression, which looks familiar to us all: (static) NSString *const; -albeit with a lot more compiler magic thrown in.

Nearly the same process occurs with macros, but with one extra step: replacement.  Macros are placeholders, which the compiler replaces with the value you #define at compile-time, which is why CLANG can show you errors and warnings.

Where the difference lies is how much work the compiler has to do to replace your abstractions, not in the "memory overhead" they will incur (which means there is absolutely no speed or performance to squeeze out).  Besides, NSString* is a brilliant class cluster that's been optimized over the years, especially with literal constants, where a sort of caching occurs in the binary itself.  That way, literals used over and over again don't get reallocated over and over again.  Though, to make one thing perfectly clear: #define'd literals do NOT reduce memory overhead!