2014-01-10 3 views
1

Код:Как отключить предупреждения Xcode 64bit/32bit или лучше, исправить их?

#define ASSERT_INDEX_IS_WITHIN_BOUNDS(idx,array) 
    NSAssert2(idx >= 0 && idx <= (self.array.count-1), @"index %d beyond bounds [0 .. %d]", idx, (self.array.count-1)) 

выше макрос вызывает следующее предупреждение:

Значения типа 'NSUInteger' не должны быть использованы в качестве аргументов формата; добавьте явное преобразование в «unsigned long».

Это в коде третьей стороны и есть НАГРУЗКИ из них. Как заставить их замолчать/исправить?

+0

строить только для 32-бит? –

+0

@MichaelDautermann Ориентация iPhone 5S. – duci9y

+1

в конечном счете, всегда лучше заставить их исправлять;) –

ответ

3

Вы все еще можете запустить приложение на iPhone 5S, построив его только для 32-разрядных, поскольку iPhone 5S будет запускать существующие 32-разрядные приложения. Многим приложениям придется ждать, чтобы начать сборку для 64-битных, пока поставщики библиотек не обновят свой код для исправления 64-разрядных проблем, а в случае статических библиотек даже включить 64-битную сборку своего кода.

На самом деле нет никакой причины, по которой вам абсолютно необходим ваш код для запуска в 64-битном режиме прямо сейчас, что я могу видеть, и даже если вы это сделали, вы не смогли бы гарантировать стабильность сторонних библиотек, которые вы используете , Поэтому я бы посоветовал вам на данный момент придерживаться только 32-битного построения, и он будет отлично работать на iPhone 5S.

Если вам по какой-то причине необходимо было создать ваше приложение для 64-разрядной версии, вам придется либо заставить поставщика библиотеки обновить свой код, либо вам придется удалить его и написать собственный код для обработки того, что их делало.

EDIT:

Чтобы исправить это точное предупреждение, в тех местах, где она имеет %d, замените их %lu.

+0

Я уже перешел на 32bit: P Но мне все еще интересно, как это можно исправить, поскольку это всего лишь предупреждение. – duci9y

+0

Предупреждения могут быть серьезными проблемами. Просто потому, что он все еще позволяет вам скомпилировать его, это не значит, что он будет работать правильно или вообще. На самом деле даже код без каких-либо предупреждений может не работать. Что касается того, о чем предупреждает предупреждение, в данном конкретном случае это просто происходит из используемой строки формата. Но если это код третьей стороны, вы, вероятно, хотите, чтобы они исправили его, иначе у вас будет большой беспорядок, если вы внесете изменения, а затем захотите использовать обновленную версию, сохраняя при этом некоторые из ваших изменений. – Gavin

+0

Это говорит о предупреждениях и методах кодирования в целом. Я просто хотел бы знать, может ли это конкретное предупреждение фиксироваться/замолчать постоянно. – duci9y

0

Использование NSInteger/NSUInteger может решить ваши неявные предупреждения о преобразовании.

В моем коде я использовал типы int/long. Если вам необходимо поддерживать как 32-разрядные и 64-разрядные процессоры, это один из способов решить эту

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
    typedef long NSInteger; 
    typedef unsigned long NSUInteger; 
#else 
    typedef int NSInteger; 
    typedef unsigned int NSUInteger; 
#endif 

Как вы можете видеть из NSObjCRuntime.h он преобразует типы NS в беззнаковые/подписанных межды/длинный на основе LP64 (64bit) flag

надежды, что помогает.

Смежные вопросы