设置SDWebImage中maxCacheSize动态管理图片内存缓存大小无效。maxCacheSize和maxMemoryCost的定义和使用。

在按照之前我的那片博文介绍的方法修复了强引用造成的SDWebImage无法释放自己的图片缓存后,虽然它已经可以在收到内存警报时清除内存的缓存,但是却仍然会偶尔遇到闪退。自己猜测可能是因为在收到内存警报时正在下载的图片大小的比较大,导致内存警报没来得及处理,内存就被撑爆了。所以考虑使用maxMemoryCost或者maxCacheSize来控制内存cache的大小。在不设置maxMemoryCost,而只设置了maxCacheSize的时候,leaks中看到内存使用量还是在持续增加的。并没有达到预期效果

在阅读官方文档和各种网上文章发现对于maxCacheSize的具体定义还是先对迷惑的。最后在Issue 1206 of SDWebImage in Github中发现maxCacheSize只是在cleanDiskWithCompletionBlock方法中使用到,而这个方法只会被cleanDisk(手动清理disk缓存)backgroundCleanDisk (当应用切到后台时清理disk缓存)调用,并不会动态的维持cache的大小。所以在程序运行时并不会动态管理内存大小。

而maxMemoryCost是直接设置NSCache的totalCostLimit属性,而NSCache会动态的保持内存cache的大小。此外maxMemoryCost设置的是内存缓存中所有照片的像素总数量。

maxCacheSize表示的意思应该是清理disk缓存时,disk缓存中能储存的最大size。不考虑内存缓存也不动态控制内存缓存大小。

cleanDiskWithCompletionBlock方法中使用到maxCacheSize的代码段如下:

        // If our remaining disk cache exceeds a configured maximum size, perform a second
        // size-based cleanup pass.  We delete the oldest files first.
        if (self.maxCacheSize > 0 && currentCacheSize > self.maxCacheSize) {
            // Target half of our maximum cache size for this cleanup pass.
            const NSUInteger desiredCacheSize = self.maxCacheSize / 2;

            // Sort the remaining cache files by their last modification time (oldest first).
            NSArray *sortedFiles = [cacheFiles keysSortedByValueWithOptions:NSSortConcurrent
                                                            usingComparator:^NSComparisonResult(id obj1, id obj2) {
                                                                return [obj1[NSURLContentModificationDateKey] compare:obj2[NSURLContentModificationDateKey]];
                                                            }];

            // Delete files until we fall below our desired cache size.
            for (NSURL *fileURL in sortedFiles) {
                if ([_fileManager removeItemAtURL:fileURL error:nil]) {
                    NSDictionary *resourceValues = cacheFiles[fileURL];
                    NSNumber *totalAllocatedSize = resourceValues[NSURLTotalFileAllocatedSizeKey];
                    currentCacheSize -= [totalAllocatedSize unsignedIntegerValue];

                    if (currentCacheSize < desiredCacheSize) {
                        break;
                    }
                }
            }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
在 C++ 设置 UDP 套接字发送和接收缓冲区大小可以使用 `setsockopt()` 函数来实现。下面是设置发送缓存大小和接收缓存大小的示例代码: ```c++ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <iostream> using namespace std; int main() { int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { cerr << "Error opening socket" << endl; return 1; } // 设置发送缓存大小 int sendbuf = 1024 * 1024; // 1MB if (setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuf, sizeof(sendbuf)) == -1) { cerr << "Error setting send buffer size" << endl; return 1; } // 设置接收缓存大小 int recvbuf = 1024 * 1024; // 1MB if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &recvbuf, sizeof(recvbuf)) == -1) { cerr << "Error setting receive buffer size" << endl; return 1; } // 输出设置后的缓存大小 int sendbuf_new, recvbuf_new; socklen_t len = sizeof(sendbuf_new); if (getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuf_new, &len) == -1) { cerr << "Error getting send buffer size" << endl; return 1; } cout << "Send buffer size: " << sendbuf_new << endl; len = sizeof(recvbuf_new); if (getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &recvbuf_new, &len) == -1) { cerr << "Error getting receive buffer size" << endl; return 1; } cout << "Receive buffer size: " << recvbuf_new << endl; close(sockfd); return 0; } ``` 在上面的示例代码,我们首先创建了一个 UDP 套接字,并设置了发送缓存大小和接收缓存大小为 1MB。然后,我们使用 `getsockopt()` 函数获取了设置后的缓存大小,并输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值