HYBLoopScrollView内存不释放?轮播图block循环引用与weakSelf用法全解 HYBLoopScrollView内存不释放轮播图block循环引用与weakSelf用法全解【免费下载链接】HYBLoopScrollView一行代码接入轮播组件自带图片下载、缓存相关功能无任何第三方依赖、轻量级组件。项目地址: https://gitcode.com/gh_mirrors/hy/HYBLoopScrollView本文讲解 iOS 轮播组件HYBLoopScrollView为什么会出现“内存不释放”以及如何用__weak声明weakSelf打破 block 循环引用。这是轻量级轮播组件新手最常踩的坑看完这篇完整指南5 分钟就能彻底解决轮播图内存泄漏问题。一、为什么轮播组件的内存“释放不掉”HYBLoopScrollView 是一个一行代码接入、自带图片下载与缓存、无任何第三方依赖的轻量级轮播组件当前版本 3.2.1。它唯一的创建入口就是带两个 block 回调的类方法didSelect点击广告回调和didScroll滚动切换回调。问题就出在这两个 block 上。看组件源码 HYBLoopScrollView.mproperty (nonatomic, copy) HYBLoopScrollViewDidSelectItemBlock didSelectItemBlock; property (nonatomic, copy) HYBLoopScrollViewDidScrollBlock didScrollBlock;block 被组件强持有copy。如果你在 block 里直接写self就会形成一条闭环控制器 self → 强持有 loop → loop 强持有 block → block 强引用 self这就是典型的block 循环引用控制器永远无法被销毁页面反复 push/pop 后内存持续上涨表现为“轮播图内存不释放”。官方在 README.md 的「注意事项」一节中专门提醒了这一点。二、weakSelf 用法三步搞定最快解决方法✅第一步创建轮播组件前先声明弱引用__weak __typeof(self) weakSelf self;✅第二步block 内部一律使用 weakSelf不要出现 selfHYBLoopScrollView *loop [HYBLoopScrollView loopScrollViewWithFrame:CGRectMake(0, 40, 320, 120) imageUrls:images timeInterval:5 didSelect:^(NSInteger atIndex) { // 用 weakSelf 调用打破循环引用 [weakSelf dismissViewControllerAnimated:YES completion:NULL]; } didScroll:^(NSInteger toIndex) { }];✅第三步验证是否修复断点打在控制器的dealloc上返回页面时能打印 dealloc 日志说明内存已正常释放。Demo 工程里的 TestViewController.m 就是标准写法可以直接对照// 请使用weakSelf不然内存得不到释放 __weak __typeof(self) weakSelf self; HYBLoopScrollView *loop [HYBLoopScrollView loopScrollViewWithFrame:... didSelect:^(NSInteger atIndex) { [weakSelf dismissViewControllerAnimated:YES completion:NULL]; } didScroll:^(NSInteger toIndex) { }];三、一个容易忽略的细节定时器配对调用除了 block轮播组件内部的自动滚动定时器也值得注意。组件提供了配套的 pauseTimer / startTimer API建议在viewDidAppear:中启动、viewDidDisappear:中暂停可参考 Demo 的 ViewController.m避免页面离开后定时器仍在空转。另外组件在收到内存警告时会自动清理图片缓存从 3.1.3 版本起还去掉了内存缓存、改为用完即释放的加载方式同一界面放多个轮播控件时内存也不会暴涨。四、常见问题速查FAQQblock 里完全不用 self需要写 weakSelf 吗A不需要。只有 block 内用到了self或强引用它的对象时才需要 weakSelf。Q修复后怎么确认图片缓存没问题A调用 imagesCacheSize 查看缓存占用必要时用clearImagesCache清空。Q怎么安装A支持 CocoaPods见 HYBLoopScrollView.podspec也可直接把HYBLoopScrollView文件夹拖入工程无需任何配置。五、总结记住一句话就能解决 90% 的轮播图内存问题组件强持有你的 block你的 block 就别强持有 self。声明__weak __typeof(self) weakSelf self;block 内改用 weakSelf轮播组件即可随页面正常释放。【免费下载链接】HYBLoopScrollView一行代码接入轮播组件自带图片下载、缓存相关功能无任何第三方依赖、轻量级组件。项目地址: https://gitcode.com/gh_mirrors/hy/HYBLoopScrollView创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考