2015-10-29 5 views
7

Эта документация-Xcode для NSNotFound довольно запутанным:Какова доступность NSNotFound?

Он говорит: "Доступный в прошивкой 2.0 через 8.4" и "Наличие: IOS 8,1 до 8,0". Итак ... Доступен ли он до 8.0? Или в 9.0+? Кроме того, что происходит здесь, если это так?

+0

когда-нибудь узнает? Или просто попробовал посмотреть, как он ведет себя в разных версиях? В текущей документации теперь говорится «Доступность (от 8.0 до 8.0)». – Alex

+1

@Alex у меня нет. Кажется, что он работает нормально, по крайней мере, с iOS 7.2 до 9.2.1, так как это то, что поддерживает наше приложение. –

+1

Кажется, что я отлично работаю и от iOS 7.0 до 9.2.1. Weird. – Alex

ответ

7

Вставить availabilityOfNSNotFound == NSNotFound шутка здесь.


В какой-то момент, когда Apple, толкал обязательную поддержку устройства 64-битную (? IOS 8,4 SDK), декларация NSNotFound была изменена с:

enum {NSNotFound = NSIntegerMax}; 

в

static const NSInteger NSNotFound = NSIntegerMax; 

Вы можете проверить это в <Foundation/NSObjCRuntime.h>.

Документация не была изменена, поэтому доступность enumNSNotFound больше не находится в SDK. Но с iOS 9 и выше доступно static const NSIntegerNSNotFound.

Хотя я не могу ответить на истинную доступность NSNotFound, так как я не работаю для Apple (как разработчик, я думаю, что это безопасно использовать во всех версиях iOS с версии 2.0, иначе многие классы Foundation сломаются, поскольку они могут вернуться NSNotFound), вы можете проверить, если ячейка памяти для NSNotFound является NULL:

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wtautological-compare" 
BOOL found = (&NSNotFound != NULL); 
#pragma clang diagnostic pop 
if (found) { 
    NSLog(@"meh"); 
} 
+1

Приятное обнаружение @JAL! – Alex

1

я понял, что NSNotFound является статической постоянной, и поэтому оно не должно иметь значения, какой ОС устройство имеет, как значение не должно изменения после компиляции.

Чтобы подтвердить это, я сделал простейший файл я мог бы и посмотрел на его скомпилированную сборке (без оптимизации):

Слева: оригинального исходного C код. Справа: LLVM сборка выход.

An illustration showing NSNotFound is replaced with its absolute value at compile time

Как вы можете видеть, NSNotFound заменяется его абсолютное значение, в данном случае 0x7fffffffffffffff, так как это 64-битная компиляция. Для 32-битных компиляций это будет 0x7fffffff.

Это замечательно. Это означает, что до тех пор, пока он компилируется, он будет работать (предполагая, что Apple никогда не изменяет значение NSNotFound)!

Хотя это не объясняет странную документацию, это дает некоторую уверенность в том, что она должна работать на всех версиях iOS.

+0

Вы действительно не должны использовать жестко заданное значение вместо константы. Постоянные разоблачаются по этой причине! Кроме того, значение присваивается 'NSIntegerMax', которое расширяется до' LONG_MAX', что потенциально может быть зависящим от платформы. – JAL

+0

@JAL Я думаю, вы меня не понимаете. Я использую константу! Левая панель - это код C, а правая панель - это сборка выходного файла компилятора. –

+0

Я не понимаю вас. Я просто говорю, что использовать константу небезопасно. – JAL