nullable:可以为空 nonnull:非空
用来修饰属性,方法的参数,方法的返回值。
优点:提高开发规范,减少team之间不必要的交流。
注意点:只能修饰对象,不能修饰基本数据类型。
用法一: 修饰属性
方式一: @property (copy,nonatomic,nullable)NSString *name;
方式二: @property (copy,nonatomic)NSString * _Nullable name;
方式三: @property (copy,nonatomic)NSString * __nullable name;
方式一: @property (copy,nonatomic,nonnull)NSString *name;
方式二: @property (copy,nonatomic)NSString * _Nonnull name;
方式三: @property (copy,nonatomic)NSString * __nonnull name;
用法二:方法中使用
修饰方法参数和返回值
- (nonnull NSString *)test:(nonnull NSString *)str;
- (NSString * _Nonnull)test:(NSString * _Nonnull)str;
新出的宏
1, 在NS_ASSUME_NONNULL_BEGIN 和NS_ASSUME_NONNULL_END之间,定义的所有对象属性和方法默认都是nonnull。
2,null_resettable 修饰属性 意思是:set方法可以为空,get方法不能为空。 注意:使用该关键字,必须重写set或者get方法。
3,_Null_unspecified:不确定是否为空,没有应用价值。 __null_unspecified
泛型
作用:限制类型。
使用场景:1,在集合中比较常用。
2,当声明一个类,类里面的某些属性的类型不确定,这时可以使用泛型。
优点:1,提高开发规范,减少team之间不必要的交流。
2,从集合中取出来直接使用,不用向下转型。
__kindof
表示当前类或者它子类。
如果方法的返回值类型使用了该关键字修饰的话,那么既可以使用当前类的指针变量接收,也可以使用子类的指针变量接收。
@interface Person : NSObject
// __kindof Person *:表示可以是Person类或者它的子类
+ (__kindof Person *)person;
@end
@implementation ViewController
Person *p = [Person person];//既可以Person类型接收
SonPerson *pp = [Person person];//也可以Person的子类SonPerson类型接收
}
@end