iOS9新增关键字和一些新特性的学习

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  :在调用的时候,很清楚的知道返回类型

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值