iOS9新增关键字和一些新特性的学习
一、先谈谈iOS9中新增的几个关键字的学习
nullable: 表示该属性的值可以为nil
// 写法一
@property (nonatomic, strong, nullable) NSString * name;
// 写法二
@property (nonatomic, strong) NSString * _Nullable name;
nonnull:表示该属性的值不可以为空
// 写法一
@property (nonatomic, strong, nonnull) NSString * name;
// 写法二
@property (nonatomic, strong) NSString * _Nonnull name;
如果给name赋值nil或者NULL,编译器会报一个警告
Null passed to a callee that requires a non-null argument
null_resettable: 表示该属性的get方法返回值不能为空
如果属性赋值为空,会报如下警告
Synthesized setter 'setName:' for null_resettable property 'name' does not handle nil
解决方法:重写该属性的set或者get方法,处理nil的情况
null_unspecified: 表示不确定该属性的值是否为空
// 写法一
@property (nonatomic, strong, null_unspecified) NSString * name;
// 写法二
@property (nonatomic, strong) NSString * _Null_unspecified name;
两个宏定义的介绍,这两个宏是从UIButton.h定义文件中找出来的,分别该文件中的开头和结尾,这两个宏定义的意思表示:在这两者之间定义的属性和方法默认是nonnull类型的,也就是不可以赋值为nil或者NULL
#define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
#define NS_ASSUME_NONNULL_END _Pragma("clang assume_nonnull end")
二、泛型简单介绍@interface NSArray<ObjectType> (NSExtendedArray)
- (NSArray<ObjectType> *)arrayByAddingObject:(ObjectType)anObject;
- (NSArray<ObjectType> *)arrayByAddingObjectsFromArray:(NSArray<ObjectType> *)otherArray;
上面这几行代码是在NSArray中的定义中截取出来的,很明显ObjectType就是NSArray支持的泛型类型,so,自己需要用到泛型的时候就可以这样定义了
@interface Animal<ObjectType> : NSObject
//...属性...方法
@end
__covariant和__contravariant的介绍
__covariant 表示:子类给父类赋值,即子类强转为父类的类型
__contravariant 表示:父类给子类赋值,即父类强转为子类的类型
举个栗子:现目前有三个类,Animal、Dog、Cat,Animal是Dog和Cat的父类
这是Animal的定义
@interface Animal<ObjectType> : NSObject
@end
Animal<Animal *> * mal = [[Animal alloc] init];
Animal<Dog *> * dog = [[Animal alloc] init];
// 子类给父类赋值
mal = dog;
当编译这段代码的时候系统会给出这样一个警告:
Incompatible pointer types assigning to 'Animal<Animal *> *' from 'Animal<Dog *> *'
这时候要解决警告,就用用到__covariant了
Animal的定义改为
@interface Animal<__covariant ObjectType> : NSObject
@end
同理:如果是dog = mal;
Animal的定义改为
@interface Animal<__contravariant ObjectType> : NSObject
@end
三、__kindof的介绍
- (__kindof UICollectionViewCell *)dequeueReusableCellWithReuseIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath;
- (__kindof UICollectionReusableView *)dequeueReusableSupplementaryViewOfKind:(NSString *)elementKind withReuseIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath;
这两个方法是UICollectionView里面截取的方法,好处如下:
__kindof:表示当前类或者它子类
__kindof书写格式:
放在类型前面,表示修饰这个类型(__kindof ClassName *)
__kindof :在调用的时候,很清楚的知道返回类型