跳过正文

SDWebImageDefine源码学习

·2 分钟
目录

前言
#

block ,枚举字符串,内敛函数学习

block 声明
#

typedef void(^SDWebImageNoParamsBlock)(void);

枚举字符串
#

typedef NSString * SDWebImageContextOption NS_EXTENSIBLE_STRING_ENUM;
//SDWebImageContextOption类型
//NS_EXTENSIBLE_STRING_ENUM 可用于swift 枚举字符串
//SDWebImageContextOption

参看 csdn 解析

FOUNDATION_EXPORT
#

效率比较比#define 高,是地址的比较,在定义常量字符串时,要写在两个文件里面。

//.h
FOUNDATION_EXPORT  NSString *const kMyConstantString;
//.m
 NSString *const kMyConstantString = @"hello world";
#define kMyConstantString @"hello world"//只在.h 文件使用
  • FOUNDATION_EXPORT 有如下两点作用
  1. Visible Symbolity

  2. Compatibility to other source code.

内敛函数
#

可直接进行调用函数

//.h文件
FOUNDATION_EXPORT CGFloat SDImageScaleFactorForKey(NSString * _Nullable key);
//.m文件
inline CGFloat SDImageScaleFactorForKey(NSString * _Nullable key) {
    CGFloat scale = 1;
    if (!key) {
        return scale;
    }

    }
    //内联函数

移位枚举
#

  • NS_OPTIONS

这种枚举用来处理多情况,也就是说既能响应开始的情况,又能输出之后的情况,

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};

补充
#

  • 应该用枚举表示状态机的状态、传递给方法的选项以及状态码等值,给这些值起个易懂的名字,就像监听网络状态的枚举。
  • 如果把传递给某个方法的选项表示为枚举类型,而多个选项又可同时使用,那么就将各选项定义为 2 的幂,以便通过按位或操作将其组合起来。
  • 用 NS_ENUM 与 NS_OPTIONS 宏来定义枚举类型,并指明其底层数据类型。这样可以确保枚举是用开发者所选的底层数据类型实现出来的,而不会采用编译器所选的类型
  • 在处理枚举类型的 switch 语句中不要实现 default 分支。这样的话,加入新枚举之后,编译器就会提示开发者:switch 语句并未处理所有枚举