NSInteger is declared as `typedef int NSInteger;`, why we should cast it to long?