OC中的一些修饰关键字

作者: jianshu_wl | 来源:发表于2016-07-08 23:42 被阅读1265次
  • nullable: 表示对象可以为空
    下面是三种写法:
@property (nullable, nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString * _Nullable name;
@property (nonatomic, strong) NSString * __nullable name;
  • nonnull: 表示对象不能为空
    下面是三种写法:
@property (nonnull, nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString * _Nonnull name;
@property (nonatomic, strong) NSString * __nonnull name;
  • null_resettable: 当用此关键字修饰对象属性时, 表示通过getter方法获取的对象属性不为空,通过setter方法进行赋值时可以为空, 而且必须实现其getter或者setter方法, 不然会报警告.

  • 泛型

可以通过泛型的特性来限制数组中的元素只能为某一种类型, 例如有一个数组,我们想让放入里面的元素都为NSString类型, 那么可以这么写:

@property (nonatomic, strong) NSMutableArray<NSString *> * names;

我们也可以自定义泛型:
下面我们新建一个Animal类, 并给Animal类添加一个表示物种的属性species, 这个属性的类型时是不确定的.
Animal.h中代码如下:

#import <Foundation/Foundation.h>

@interface Animal<ObjectType> : NSObject
@property (nonatomic, strong) ObjectType species;
@end

接着在ViewController.m进行测试,在初始化时如果指定了ObjectType为某一类型后, 在对属性species进行赋值时, xcode会进行提示species所需的类型,如下图:

自定义泛型
  • __covariant: 协变, 子类可以强转为父类(里氏替换原则).
    __contravariant: 逆变, 父类可以强转为子类.
    新建两个Animal对象ab,分别制定属性的类型为NSStringNSMutableString类型,通过ab进行强转时会出现如下警告:
强转时报错

如果想要a = b不报警,也就是允许子类强转为父类,则需要在Animal.h加入__covariant关键字, 代码如下:

#import <Foundation/Foundation.h>

@interface Animal<__covariant ObjectType> : NSObject
@property (nonatomic, strong) ObjectType species;
@end

如果想要b = a不报警,也就是允许父类强转为子类,则需要在Animal.h加入__contravariant关键字, 代码如下:

#import <Foundation/Foundation.h>

@interface Animal<__contravariant ObjectType> : NSObject
@property (nonatomic, strong) ObjectType species;
@end
  • __kindof: 表示当前类或者其子类.

例如在UITableView类中有如下方法:

- (nullable __kindof UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath; 

这里的__kindof表示的含义就是该方法返回的是UITableViewCell对象,或者是UITableViewCell的子类对象.

相关文章

  • OC中的一些修饰关键字

    nullable: 表示对象可以为空下面是三种写法: nonnull: 表示对象不能为空下面是三种写法: null...

  • OC语言之属性关键字

    属性关键字 读写权限 readonly readwrite(默认) 原子性 OC中的属性可以修饰成nonatomi...

  • OC中的变量与常量

    从我的理解出发,在OC中,变量包括常量,变量是OC中对所有类型定义的统称。书上说:用关键字const修饰的变量称之...

  • 访问并修改一个类的私有属性

    在OC中的类会有某些私有属性,这些属性通常写在.m文件中或在.h文件中用@private关键字进行修饰。某些...

  • weak的底层实现原理?

    1.何为weak? weak 是oc中定义对象属性property时用于修饰对象属性的关键字。 2.weak有什么...

  • IOS-Block

    Block初探 blcok的分类 不同关键字修饰的变量auto和static在OC中有个默认的关键字auto,在我...

  • java-final关键字修饰变量

    在java中,final关键字可以对类、方法以及变量进行修饰,这里对final修饰变量进行一些探讨。final修饰...

  • oc属性关键字整理

    看面试题的经常看到一些关于关键字的问题,在oc中修饰一个属性一般有4种关键词 原子性--- atomic/nona...

  • final、abstract以及接口

    final关键字 final 关键字可以用来修饰类,属性和方法。 final修饰类 Java 中 final 修饰...

  • OC由浅入深系列 之 属性

    一、什么是属性 在OC中,用@property 关键字修饰的类的成员成为属性。 在属性出现之前,声名一个实例变量通...

网友评论

  • 鱼落于天:哎,原来这些东西就是swift中可选的前身啊
  • tztTzt:OC中没有泛型折磨说吧,一般说非正式 正式协议吧
  • DrunkenMouse:开发中常用的感觉也就nonnull和泛指了

本文标题:OC中的一些修饰关键字

本文链接:https://www.haomeiwen.com/subject/sverjttx.html