mktemp просто изменяет буфер, который вы передаете, и возвращает тот же самый указатель, который вы передаете, лишнего буфера для освобождения нет.
Это как минимум OSX manpage описывает его (я не смог найти документацию для IPhone) и man-страницу posix (хотя пример в posix manpage выглядит неправильно, так как он передает указатель на строковый литерал - возможно, старыйОстаток, функция также помечена как устаревшая - используйте вместо этого mkstemp. На странице OSX специально упоминается, что это ошибка).
Итак, вот что произойдет:
char template[] = "/tmp/fooXXXXXX";
char *ptr;
if((ptr = mktemp(template)) == NULL) {
assert(ptr == template); //will be true,
// mktemp just return the same pointer you pass in
}