NSLocalizedString is a handy macro and can probably be executed as a function.
However, there are good reasons why NSAssert and friends are macros other than those specified in George's answer. NSAssert evaluates the boolean expression to determine if an exception should be thrown. This logical expression can be quite expensive computational rather than what you want to do in your release code. There is no mechanism in C (and therefore Objective-C) that omits the usual function calls to build the release without resorting to a preprocessor or, possibly, using things such as:
if (debug) { assertAsAFunction(foo == 3, "foo should be 3"); }
Another advantage of the NSAssert macro is that the condition can be compressed for use in a log message.
source share