Это работает, когда вы возвращаете объект, а не примитивное значение.
Ответ 2
NSInteger не является объектом. Это просто примитивный примитив int. Поэтому он никогда не будет nil. Просто относитесь к нему так же, как если бы вы использовали int прямо вверх.
Edit:
Чтобы изложить комментарий Cesar, в 64-битных системах NSInteger на самом деле есть long, а в 32-битных системах - int.