读SDWebImage源码获取的知识点

1.NSDta (ImageContentType) 这个分类就一个方法

+ (SDImageFormat)sd_imageFormatForImageData:(nullableNSData *)data {

    if (!data) {

        returnSDImageFormatUndefined;

    }

    

    uint8_t c;//(uint8_t:无符号char)

    [data getBytes:&clength:1];//取第一个字节判断图片类型.即图片真正类型不看你是点.png还是.jpg结尾,而是图片的二进制数据第一个字节具有唯一性.即不同类型的图片二进制数据第一个字节不同.sd作者收集的图片暂且如下,不能确定是否包含了全部图片

    switch (c) {

        case0xFF:

            returnSDImageFormatJPEG;

        case0x89:

            returnSDImageFormatPNG;

        case0x47:

            returnSDImageFormatGIF;

        case0x49:

        case0x4D:

            returnSDImageFormatTIFF;

        case0x52:

            // R as RIFF for WEBP

            if (data.length <12) {

                returnSDImageFormatUndefined;

            }

            

            NSString *testString = [[NSStringalloc]initWithData:[datasubdataWithRange:NSMakeRange(0,12)]encoding:NSASCIIStringEncoding];

            if ([testStringhasPrefix:@"RIFF"] && [testStringhasSuffix:@"WEBP"]) {

                returnSDImageFormatWebP;

            }

    }

    returnSDImageFormatUndefined;

}


2.SDWebImageCompat 这个类让我好好看了系统了两个宏定义头文件

<Target Conditionals>  <Availability>(牵连出来的)

这两个头文件代码不多,建议直接细细过一遍.特别是xcode给的注释部分.
Availability.h主要是定义开发环境的版本限制.比如:

  #if __IPHONE_OS_VERSION_MIN_REQUIRED != 20000 && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0

 #error SDWebImage doesn't support Deployment Target version < 5.0   

 #endif

这就限制了sd代码只能运行在ios5.0及以后的版本.不然直接报错  (#error用法类似#warning)
Target Conditionals 主要定义开发环境是啥,是iPhone?是模拟器?是mac桌面还是iPad等等.比如sd

#if !TARGET_OS_IPHONE && !TARGET_OS_IOS && !TARGET_OS_TV && !TARGET_OS_WATCH

    #define SD_MAC 1

#else

    #define SD_MAC 0

#endif


3.dispatch_main_async_safe//到主线程去执行block

#ifndef dispatch_main_async_safe

#define dispatch_main_async_safe(block)\

    if (strcmp(dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL), dispatch_queue_get_label(dispatch_get_main_queue())) ==0) {\

        block();\ //比较当前线程的标签和主线程的标签,如果相同执行执行block

    } else {\ //如果不同,则跳到主线程执行.

        dispatch_async(dispatch_get_main_queue(), block);\

    }

#endif

4.CGContextSetInterpolationQuality(destContext,kCGInterpolationHigh);

解码图片的方法中有这个api,它的作用是 设置上下文插值.Interpolation是一种图像处理方法,它可以为数码图像增加或减少象素的数目。某些数码相机运用插值的方法创造出象素比传感器实际能产生象素多的图像,或创造数码变焦产生的图像。实际上,几乎所有的图像处理软件支持一种或以上插值方法。图像放大后锯齿现象的强弱直接反映了图像处理器插值运算的成熟程度

typedef CF_ENUM (int32_t, CGInterpolationQuality) {

  kCGInterpolationDefault = 0/* Let the context decide. */

  kCGInterpolationNone = 1,    /* Never interpolate. */

  kCGInterpolationLow = 2,     /* Low quality, fast interpolation. */

  kCGInterpolationMedium = 4,  /* Medium quality, slower than kCGInterpolationLow. */

  kCGInterpolationHigh = 3     /* Highest quality, slower than kCGInterpolationMedium. */

};


5.SDWebImageDownloader里面的循环引用

 self.session = [NSURLSessionsessionWithConfiguration:sessionConfiguration

                                                     delegate:self

                                                delegateQueue:nil];

我们知道NSURLSession对象的delegate属性是retain的

@property (nullable,readonly,retain)id <NSURLSessionDelegate> delegate;

所以初始化session之后已经是循环引用了,在没有打破这个循环引用的情况下,delloc方法根本不会被执行,所以SDWebImageDownloader没有提供打破循环引用接口时,这段delloc代码就显得多余了.

- (void)dealloc {

    [self.sessioninvalidateAndCancel];

    self.session =nil;


    [self.downloadQueuecancelAllOperations];

    SDDispatchQueueRelease(_barrierQueue);

}

不过SDWebImageDownloader本身设计就是全局单例,它和这个session都没有被释放的必要.故循环引用也没有关系.只不过感觉多余了这段代码(给我感觉就是跟在delloc方法里面释放timer一样).(:-D成功的在鸡蛋里面挑了一波骨头)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值