Подтвердить что ты не робот

Что является ненулевым в объективном C?

Может кто-нибудь уточнить, почему nonnull введен в iOS 9?

Например, метод NSArray + (instancetype)array; теперь + (instancetype nonnull)array;

Обратитесь к: https://developer.apple.com/library/prerelease/ios/releasenotes/General/iOS90APIDiffs/frameworks/Foundation.html

Является ли это функцией уровня objective-c и как это повлияет на существующие приложения?

4b9b3361

Ответ 1

Они убедились, что везде, где тип не является нулевым, теперь он имеет тип nonnull.

Как и раньше, метод NSMutableArray addObject был

- (void)addObject:(ObjectType)anObject  

и теперь он был изменен на

- (void)addObject:(ObjectType nonnull)anObject

Таким образом, это означает, что вы не можете передать нулевой объект (nil) этому методу. То же самое, в вашем случае

+ (instancetype nonnull) array

метод никогда не вернет nil.

Ссылка: https://developer.apple.com/swift/blog/?id=25

Ответ 2

nonnull - это ключевое слово, чтобы сообщить компилятору, что возвращаемое значение (или параметр или свойство) никогда не будет равно нулю. Это было введено в предыдущей версии Xcode, чтобы обеспечить лучшую совместимость между необязательными типами Obj-C и Swift.

Подробнее об этом можно узнать в официальном блоге Swift

Ответ 3

nonnull - это ключевое слово, которое уведомляет компилятор о том, что значение, возвращаемое объектом/параметрами, никогда не будет nil.

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

Ответ 4

nullable и nonnull были введены для облегчения взаимодействия Objective C и Swift.

Цель C не делает никакой разницы между необязательными и необязательными ссылками. Тогда компилятор Swift не может быть уверен, что конкретная ссылка на Objective C-код является необязательной или нет.

аннулирование с нулевым значением является тем же, что и в Swift. Необязательная аннотация - это то же самое, что и необязательное в Swift.

Правило большого пальца - любой простой тип указателя будет считаться ненулевым (более подробно читайте официальный блог Swift)

Я бы также сказал, что эта новая аннотация также улучшит качество кода с точки зрения Objective C. Я обычно задаюсь вопросом, может ли приложение сбой, если параметр nil в качестве параметра? Например:

id var;
NSMutableArray *a = [NSMutableArray new];
[a addObject:var];

Компилятор ничего не говорит в этом случае, и ваше приложение будет аварийно завершено во время выполнения! Теперь с этой новой аннотацией вы увидите предупреждение во время компиляции. Я знаю, что этот пример глупо, но есть некоторые случаи, когда вы не знаете, нужно ли проверять, является ли свойство нулем перед вызовом метода, если вы не прочитали документацию.