nil
不能为空
nonnull__nonnull
`@property (nonatomic,strong)NSArray *__nonnull ages;
@property (nonatomic,strong,nonnull) NSArray * ages;
可以为空
nullable__nonnullable
@property (nonatomic,strong)NSArray *__nullable ages;
@property (nonatomic,strong,nullable)NSArray * ages;`
- null_resettable
set可以为空,get不能为空
@property (null_resettable,nonatomic,strong)NSArray *ages;
需要重写set方法。例如:
-(void)setNums:(NSArray *)nums{
if (nums ==nil)return;
_nums = nums;
}
比如UIViewController的view属性,就是即使set为空,还是会懒加载一个view的值
范围内所有属性都为不能为空。
不过可以给范围内部分属性设为__nullable,该属性就变为可以为空了
NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END
泛型
声明数组、字典……里面只能装什么
@property (nonatomic,strong)NSArray <NSString *> *__nonnull names;
@property (nonatomic,strong)NSMutableDictionary <NSString *,NSNumber *> *dic;
一方面可以控制传值,另方面取出来的值可以直接用点语法,像是_names.lastObject.count
自定义泛型举例:
@interface XXBag<Type> : NSObject
-(void)add:(Type)objecg;
-(Type)get:(int)index;
@end
使用时
XXBag<XXBook *> *b1 = [[XXBagalloc]init];
[b1 add:<#(XXBook *)#>]
XXBag<XXCar *> *b2 = [[XXBag alloc]init];
比如系统中的NSMutableArray,@interface NSMutableArray<ObjectType> :NSArray<ObjectType>
协变性covariant
正常情况下
XXBag<NSString *> *b1 = [[XXBagalloc]init];
XXBag<NSMutableString *> *b2 = [[XXBagalloc]init];
b1 = (XXBag<NSString *> *)b2;
需要强转
如果添加了covariant
@interface XXBag<__covariant Type> :NSObject
-(void)add:(Type)objecg;
-(Type)get:(int)index;
@end
那么
b1 = (XXBag<NSString *> *)b2;
就可以直接b1 = b2;
结论:__covariant 小类型(泛型类的子类类型)->大类型(泛型类的 父类类型),可以不用添加强转
__contravariant 与__covariant相反 大类型(泛型类的 父类类型) -> 小类型(泛型类的子类类型)
__kindof
表示:可能是
作用:父类类型,可以用子类类型来接收
使用:在返回值的类型前面加上__kindof,既可以告知使用者返回参数可能是什么类型,又可以避免需要强转
-(__kindof NSArray * __nonnull)test2:(NSArray *__nonnull)ary{
return@[];
}
NSMutableArray *a = [selftest2:@[]];
其他
- UIWindow
- Storyboard Reference
- UIStackView
- Search API
- 3D touch