1、NS_ASSUME_NONNULL_BEGIN
和NS_ASSUME_NONNULL_END
- 现在新创建的h文件中,xcode都会自动的帮我们加上这两个宏。在这两个宏中间声明的属性和方法参数都默认为
nonnull
,表示不能为nil
,如果为属性或者方法参数设置为nil
时,xcode就会给出Null passed to a callee that requires a non-null argument
的警告 - 如果想要取消警告,可以加上
__nullable
@property (nonatomic,copy) NSString * __nullable img_url;
- (void)setCtrlTitle:(NSString * __nullable)titleStr;
2、NS_UNAVAILABLE
- 表示不能让外界获取到这个方法,比如我写了一个类供外界使用,我们不想让外部调用时用
init
方法去初始化,而是希望调用我们指定的方法去初始化,就可以在.h文件中这样写
- (instancetype)init NS_UNAVAILABLE;
- 使用了
NS_UNAVAILABLE
后在外界调用时编译器不但不会提示补全init
方法,就算强制使用了init
也会报错
3、NS_DESIGNATED_INITIALIZER
-
NS_DESIGNATED_INITIALIZER
指定初始化方法,当一个类提供多种初始化方法时,所有的初始化方法最终都会调用这个指定的初始化方法 - 在第三方库中,一个类中会提供多个初始化方法,但是这多个初始化方法可能最终都是调用到了一个初始化方法中,如果在最终的方法中加上了
NS_DESIGNATED_INITIALIZER
,那么在阅读代码时就能很方便的找到最终的方法,从而省去了从一个一个方法去找的麻烦
这三个宏在第三方库中经常用到
系列文章
iOS中的关键字和宏(1):instancetype与id的区别
iOS中的关键字和宏(2):static与extern总结