注意:新出关键字只能修饰对象 不能修饰基本数据类型
nullable: 可为空,适配swift
nonnull: non 非 null 空
null_resettable: get方法不能返回为空,set方法可以为空。(例:控制器view)
注意:null_resettable 必须重写get方法或者set方法,处理传递的值为空的情况。
_Null_unspecified或者 __null_unspecified: 不确定是否为空
注意 :有下划线的 只能写在属性前边
NS_ASUME_NONNULL_BEGIN 和 NS_ASSUME_NONNULL_END 之间定义的所有的对象属性和方法默认都是nonnull(非空)
泛型:限制类型
泛型使用场景:在类型后面定义泛型 没有的确定泛型就是id类型
1)、在集合(数组,字典,NSSet)中使用泛型比较常见(例:NSMutableArray<NSString *> *datas)
2)、当声明一个类,类里面的某些属性的类型不确定,这时候我们才使用泛型。(类名后<ObjectType>冒号继承类前)
泛型修饰:只能修饰方法的调用
泛型好处:
1)、提高开发规范,减少程序员之间的交流
2)、通过集合取出来对像,直接当泛型对象使用,可以直接使用点语法
__covariant: 协变 修饰泛型(例:<__covariant ObjectType>), 用于泛型数据强转类型,可以向上强转,子类可以转变成父类(例:子类对象给父类对象赋值)
__contravariant: 逆变 修饰泛型(例:< __contravariant ObjectType>)用于泛型数据强转类型,可以向下强转,父类可以转变成子类(例:父类对象给子类对象赋值)
__Kindof和id、instancetype 的优缺点:
1、__Kindof:修饰类 表示当前类或者他的子类。(例:__kindof 类名 *) 用法:方法的返回值里面去用。在调用时能清楚的知道返回类型
2、id的坏处:1)、不能在编译时检查真实类型
2)、返回值没有提示
3、instancetype 自动识别当前对象的类 但是返回还是没有提示