宏__has_include
功能是检测到某个文件,是否在工程中被包含.
#if __has_include(<YYCache/YYCache.h>)
FOUNDATION_EXPORT double YYCacheVersionNumber;
FOUNDATION_EXPORT const unsigned char YYCacheVersionString[];
#import <YYCache/YYMemoryCache.h>
#import <YYCache/YYDiskCache.h>
#import <YYCache/YYKVStorage.h>
#elif __has_include(<YYWebImage/YYCache.h>)
#import <YYWebImage/YYMemoryCache.h>
#import <YYWebImage/YYDiskCache.h>
#import <YYWebImage/YYKVStorage.h>
#else
#import "YYMemoryCache.h"
#import "YYDiskCache.h"
#import "YYKVStorage.h"
#endif
宏 NS_ASSUME_NONNULL_BEGIN
和 NS_ASSUME_NONNULL_BEGIN
因为OC为了配合Swift的Option类型, 提供了__nullable
和__nonnull
指定指针类型是否为空
__nullable
: 对象可以为nil
__nonnull
: 对象不能为nil
当我们不遵循这一规则时,编译器就会给出警告。
给每个属性或方法一一指定的话很繁琐, 使用提供了 NS_ASSUME_NONNULL_BEGIN
和 NS_ASSUME_NONNULL_BEGIN
简化工作量. 被两个宏包裹的代码, 所有简单指针对象都被假定为 __nonnull
即 不为nil, 如果可能为空的则再特殊指定.
宏 NS_DESIGNATED_INITIALIZER
用来定义一些初始化方法只能过来这些标记的初始化
应该是配合Swift的指定构造函数
- (nullable instancetype)initWithPath:(NSString *)path NS_DESIGNATED_INITIALIZER;
宏 UNAVAILABLE_ATTRIBUTE
告知方法失效
- (instancetype)init UNAVAILABLE_ATTRIBUTE;
+ (instancetype)new UNAVAILABLE_ATTRIBUTE;
网友评论