"In particular, the varargs mechanism allows functions to accept any number of arguments (e.g. printf) by "popping" as many arguments off the call stack as they wish, trusting the early arguments to indicate how many additional arguments are to be popped, and of what types."
NSLog is similar; it has to trust its first argument to be consistent with the number and types of arguments actually passed to it.
If you call NSLog(x), but do not have complete control over the value of x, you cannot guarantee that.