Joe
Joe

Reputation: 47729

Why the macros in Objective-C / Cocoa?

I'm coming from a place without macros (Java/Python/C#/Scala) so perhaps my perspective is distorted but...

Why are macros used in Cocoa? Two that spring to mind are NSLocalizedString and NSAssert (and STAssert). Would it be so hard / unsuitable to make them functions (which could be inlined)? I suppose I find them a little bizarre as an unnecessary throw-back to C (and yes, I am familiar with the pedigree of Obj-C).

Is it just something that was done back in the day or is there a specific reason?

Upvotes: 4

Views: 1142

Answers (2)

JeremyP
JeremyP

Reputation: 86691

NSLocalizedString is a convenience macro and could probably be made a function.

However, there are good reasons why NSAssert and friends are macros besides the one given in Georg's answer. NSAssert evaluates a boolean expression to determine whether an exception should be thrown. That boolean expression might be quite computationally expensive and not the sort of thing you want to happen in your release code. There's no mechanism in C (and therefore Objective-C) of omitting normal function calls for a release build without resorting to the preprocessor or perhaps using stuff like:

if (debug)
{
    assertAsAFunction(foo == 3, "foo should be 3");
}

Another advantage of the NSAssert macro is that the condition can be stringified for use in a log message.

Upvotes: 4

Georg Fritzsche
Georg Fritzsche

Reputation: 99092

In general it is preferable to avoid macros, but for functionality like that provided by NSAssert(), you can't.

If you look at the definition, you'll see that it uses __LINE__, __FILE__, _cmd and self from the context it is used in. If it wasn't a macro, it wouldn't have access to that information.

For NSLocalizedString however, i see no obvious reason.

Upvotes: 8

Related Questions