¿Qué es lo no nulo en el objective C?

¿Alguien puede explicar por qué no se presenta en iOS 9?

Por ejemplo, el método NSArray + (instancetype)array; ahora es el + (instancetype nonnull)array;

Consulte: https://developer.apple.com/library/prerelease/ios/releasenotes/General/iOS90APIDiffs/frameworks/Foundation.html

¿Es esta una function de nivel objective c, y cómo afectaría esto a las aplicaciones existentes?

Se han asegurado de que siempre que el tipo no sea anulable, ahora es un tipo no nonnull .

Como antes, el método NSMutableArray addObject era

 - (void)addObject:(ObjectType)anObject 

y ahora se ha cambiado a

 - (void)addObject:(ObjectType nonnull)anObject 

Entonces significa que no puede pasar un object nulo ( nil ) a este método. De la misma manera, en tu caso

 + (instancetype nonnull) array 

el método nunca devolverá nil .

Referencia: https://developer.apple.com/swift/blog/?id=25

nonnull es una palabra key para decirle al comstackdor que el valor de retorno (o parámetro o propiedad) nunca será nulo. Esto se introdujo en una versión anterior de Xcode para permitir una mejor interoperabilidad entre Obj-C y los types opcionales de Swift.

Puedes get más información al respecto en el blog oficial de Swift.

nonnull es la palabra key que notifica al comstackdor que el valor devuelto por el object / parameters nunca será nil .

En general, debe considerar nulos y no nulos aproximadamente la forma en que usa afirmaciones o excepciones: violar el contrato es un error del progtwigdor. En particular, los valores de retorno son algo que usted controla, por lo que nunca debe devolver nil para un tipo de devolución no nulable a less que sea para la compatibilidad hacia atrás.

nula y no nula se ha introducido para facilitar la interoperabilidad de Objective C y Swift.

El objective C no hace ninguna diferencia entre las references opcionales y no opcionales. Entonces, el comstackdor Swift no puede estar seguro si una reference particular al código Objective C es opcional o no.

La anotación anulable es la misma que la opcional en Swift. La anotación no nula es la misma que no opcional en Swift.

La regla general es cualquier tipo de puntero simple que se asume que no es nulo (para más detalles, lea el blog oficial de Swift )

También diría que esta nueva anotación también mejorará la calidad del código desde el punto de vista del Objetivo C. Normalmente me pregunto si la aplicación se bloqueará si un pase no es un parámetro? Por ejemplo:

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

¡El comstackdor no dice nada en este caso y su aplicación se bloqueará en time de ejecución! Ahora, con esta nueva anotación, verá una advertencia en el time de compilation. Sé que este ejemplo es estúpido, pero hay casos en los que no sabe si necesita verificar si una propiedad es nula o no antes de llamar a un método a less que lea la documentation.