Составив код приложения iOS для arm64, я столкнулся с интересной проблемой, связанной с различными базовыми типами для пользовательских типов Foundation. Скажем, я хочу напечатать f (или stringWithFormat) число, объявленное как NSUInteger
[NSString stringWithFormat:@"%u", _depth,
Это создаст предупреждение для arm64, потому что NSUInteger объявлен как unsigned long для arm64. Поэтому я должен заменить "% u" на "% lu", но теперь это становится недействительным при компиляции для архитектуры armv7 (s), потому что для 32-разрядных архитектур NSUInteger объявлено как unsigned int. Я знаю, что предупреждение гласит: "NSUInteger не следует использовать как аргумент формата", поэтому давайте перейдем к floats:
typedef CGFLOAT_TYPE CGFloat;
в 64-битном CGFLOAT_TYPE double, а на 32-битном - float. Поэтому, делая что-то вроде этого:
- (void)foo:(CGFloat)value;
а затем
[self foo:10.0f];
[self foo:10.0];
Будет выдавать предупреждение при компиляции для двух архитектур. В 32-битной архитектуре второй вызов неверен (преобразование из double в float), в 64-битной архитектуре, первая конвертирует float в double (что нормально, но все равно не хорошо).
Хотелось бы услышать ваши мысли по этой проблеме.