SODownloader
SODownloader copied to clipboard
[self.downloadArrayWarpper addObject:item] Thread 1: EXC_BAD_ACCESS
点击下载执行- (void)downloadItem:(id<SODownloadItem>)item autoStartDownload:(BOOL)autoStartDownload 时,遇到内存问题闪退,截图如下:
开发环境:xCode 9.1 iPhone7 IOS 11.1 模拟器
还有不明白为何下面这两个数据对象为何要设置为 readonly ? @property (nonatomic, strong, readonly) NSMutableArray *downloadArrayWarpper; @property (nonatomic, strong, readonly) NSMutableArray *completeArrayWarpper;
为偶现情况,非必现。
先回答问题,用readonly是因为这个属性只有getter函数,没有setter函数,声明为readonly可以防止别人调用它的setter函数。
闪退可能是因为模拟器的原因,我在真机上没遇到过,具体的原因我现在也没找到。
@James-Geng 检查下自己的kvo代码,是否正确remove了observe。推荐使用Facebook的KVOController或者BlocksKit来使用kvo,动态再dealloc的时候移除监听
@James-Geng @iOSleep 突然觉得有可能是因为楼主遇到的可能是同步队列死锁了,因为停在了dispatch_async(self.synchronizationQueue, ^{}
block中的第一行,如果在SODownloader 内置的同步队列self.synchronizationQueue中执行downloadItem:
等下载控制方法时,会发生死锁。
可能出现这个问题的情况是在KVO观察到 downloadItem 的状态发生变化后在相同的线程中又调用了下载控制方法。所以我建议在KVO的回调中仅做保存下载状态的事,不要在这里做多余的事。
嗯, kvo 的时候得到的是在相同队列, demo 中的使用场景就是回到主线程去同步 UI 变化.
@scfhao @iOSleep 今天又检查了一下发现似乎是 [[SODownloader gameDownloader]removeObserver:self forKeyPath:SODownloaderDownloadArrayObserveKeyPath]; [[SODownloader gameDownloader]removeObserver:self forKeyPath:SODownloaderCompleteArrayObserveKeyPath]; 这两个KVO 在某个特定操作下没有及时的移除,
还有在KVO移除的时候遇到好多坑,稍有不慎多次移除就会导致crash, 现在使用@try{} 语法,在@try{} 里面做remove observe 操作,准备去看一下KVOController。
@James-Geng 好的,我一般是在展示下载列表的viewController里对这两个keyPath进行KVO,在这样的viewController的dealloc方法中remove observer。