ios – 网络完成块,递归和ARC保留周期

ios – 网络完成块,递归和ARC保留周期,第1张

概述这是一个棘手的问题,答案可能对许多网络学徒有用,包括我. 关于上下文的一些背景信息: >假设您要从在线服务下载数据 >你想异步这样做 >你想一次下载一个,然后在完成前一个下载后再做一个下载. 一种巧妙的方法是使用递归. 您可以提出的常见实现的问题是网络完成块和自身之间的保留周期.这可以使用weakSelf参考指针来解决. 但是,保留递归调用的周期呢? 我们已经实现了一个递归堆栈,自我指向下载管理类 这是一个棘手的问题,答案可能对许多网络学徒有用,包括我.

关于上下文的一些背景信息:

>假设您要从在线服务下载数据
>你想异步这样做
>你想一次下载一个,然后在完成前一个下载后再做一个下载.

一种巧妙的方法是使用递归.
您可以提出的常见实现的问题是网络完成块和自身之间的保留周期.这可以使用weakSelf参考指针来解决.

但是,保留递归调用的周期呢?

我们已经实现了一个递归堆栈,自我指向下载管理类,如下所示:

-(voID)startNetworkDownloadForObjectAtIndex:(int) anIndex{    __typeof__(self) __weak weakSelf = self;    NSURL *urlForObjectAtIndex = [SomeClass URLforIndex:anIndex];    [self.downloadManager getResourceAtURL:urlForObjectAtIndex success:^(AFhttpRequestoperation *operation,ID responSEObject) {                               if (indexOfObjectTodownload < weakself.totalNumberOfObjectsTodownload) [weakSelf startNetworkDownloadForObjectAtIndex:indexOfObjectTodownload+1];                               else [weakSelf startDOwnloadTimer];                             }                            failure:^(AFhttpRequestoperation *operation,NSError *error) {                                // response code is in operation.response.statusCode                                [weakSelf handleNetworkError:error];                            }];}-(voID)handleNetworkError:error{     // Do some error handling     [self startNetworkDownloadForObjectAtIndex:self.lastUnsentObjectIndex]; }-(voID)startDownloadTimer{     if (self.syncEngineTimer) [self.syncEngineTimer invalIDate];     self.syncEngineTimer = [NSTimer scheduledTimerWithTimeInterval:kSyncTimeInterval                                                        target:self                                                    selector:@selector(restartNetworkDownload)                                                      userInfo:nil                                                       repeats:NO];}-(voID)restartNetworkDownload{      // do some fancy calculations / etc to manage your download     int anIndex = theResultOfYourCalculation;     [self startNetworkDownloadForObjectAtIndex:anIndex];}

好的,这是一个可能的递归调用几个网络下载的例子(例如获得100个闪烁的图片),并尝试在1小时后获得新的网络.
请原谅任何编码错别字.

我们在ARC下为iOS 5.0以上的iOS设备运行此功能

当使用self.downloadManager保持对成功和失败完成块的引用时,我们显然通过使用weakSelf引用指针打破了第一级保留周期.这一切都很好,在乐器中也很顺利.

现在,在查看Instruments中的分配时,我们会启动下载 *** 作以进行多次下载.
仪器没有泄漏.
但是当重新保存堆时,你可以看到它慢慢增长.

检查分配并查看调用堆栈,看起来块看起来像是通过使用startDownloadTimer来保持对self的引用

任何可能的原因和解决方案的解释将不胜感激:)

解决方法 您的计时器保留其目标(自我).

尝试这个问题的解决方案:Weak Reference to NSTimer Target To Prevent Retain Cycle

或者使用dispatch_after代替计时器.

总结

以上是内存溢出为你收集整理的ios – 网络完成块,递归和ARC保留周期全部内容,希望文章能够帮你解决ios – 网络完成块,递归和ARC保留周期所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1021014.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存