SODownloader icon indicating copy to clipboard operation
SODownloader copied to clipboard

[self.downloadArrayWarpper addObject:item] Thread 1: EXC_BAD_ACCESS

Open James-Geng opened this issue 7 years ago • 7 comments

点击下载执行- (void)downloadItem:(id<SODownloadItem>)item autoStartDownload:(BOOL)autoStartDownload 时,遇到内存问题闪退,截图如下: qq20171214-180339

开发环境:xCode 9.1 iPhone7 IOS 11.1 模拟器

还有不明白为何下面这两个数据对象为何要设置为 readonly ? @property (nonatomic, strong, readonly) NSMutableArray *downloadArrayWarpper; @property (nonatomic, strong, readonly) NSMutableArray *completeArrayWarpper;

James-Geng avatar Dec 14 '17 10:12 James-Geng

为偶现情况,非必现。

James-Geng avatar Dec 14 '17 10:12 James-Geng

先回答问题,用readonly是因为这个属性只有getter函数,没有setter函数,声明为readonly可以防止别人调用它的setter函数。

闪退可能是因为模拟器的原因,我在真机上没遇到过,具体的原因我现在也没找到。

scfhao avatar Dec 14 '17 12:12 scfhao

@James-Geng 检查下自己的kvo代码,是否正确remove了observe。推荐使用Facebook的KVOController或者BlocksKit来使用kvo,动态再dealloc的时候移除监听

iOSleep avatar Dec 20 '17 13:12 iOSleep

@James-Geng @iOSleep 突然觉得有可能是因为楼主遇到的可能是同步队列死锁了,因为停在了dispatch_async(self.synchronizationQueue, ^{}block中的第一行,如果在SODownloader 内置的同步队列self.synchronizationQueue中执行downloadItem:等下载控制方法时,会发生死锁。

可能出现这个问题的情况是在KVO观察到 downloadItem 的状态发生变化后在相同的线程中又调用了下载控制方法。所以我建议在KVO的回调中仅做保存下载状态的事,不要在这里做多余的事。

scfhao avatar Dec 21 '17 00:12 scfhao

嗯, kvo 的时候得到的是在相同队列, demo 中的使用场景就是回到主线程去同步 UI 变化.

iOSleep avatar Dec 21 '17 03:12 iOSleep

@scfhao @iOSleep 今天又检查了一下发现似乎是 [[SODownloader gameDownloader]removeObserver:self forKeyPath:SODownloaderDownloadArrayObserveKeyPath]; [[SODownloader gameDownloader]removeObserver:self forKeyPath:SODownloaderCompleteArrayObserveKeyPath]; 这两个KVO 在某个特定操作下没有及时的移除,

还有在KVO移除的时候遇到好多坑,稍有不慎多次移除就会导致crash, 现在使用@try{} 语法,在@try{} 里面做remove observe 操作,准备去看一下KVOController。

James-Geng avatar Dec 21 '17 09:12 James-Geng

@James-Geng 好的,我一般是在展示下载列表的viewController里对这两个keyPath进行KVO,在这样的viewController的dealloc方法中remove observer。

scfhao avatar Dec 22 '17 00:12 scfhao