我的内存泄漏似乎来自保留周期。每次运行此代码时,内存分配大小都会增加:
- (void)nextPhoto {
self.photoIndex++;
if (self.photoIndex >= [self.photos count]) {
self.photoIndex = 0;
}
__weak Photo *photo = [self.photos objectAtIndex:self.photoIndex];
[[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:photo.thumbnailURLString] options:SDWebImageRetryFailed progress:nil
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
}];
}
代码在2秒计时器上循环:
self.timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(nextPhoto) userInfo:nil repeats:YES];
在我收到内存过度使用事件之前,总内存使用量不受限制地增加。
为什么此代码会导致保留周期?在这种情况下,我需要一种特殊的方式来处理自我吗?
self.photos
是NSMutableArray
self.photoIndex
是NSInteger
SDWebImageManager
是一个维护良好的图书馆:https://github.com/rs/SDWebImage我在许多其他位置使用它而没有任何问题
答案 0 :(得分:1)
即使您在完成块中使用self,我也不会在此处看到任何涉及保留周期的问题。块所有者是SDWebImageManager所以这里没有问题。如果将块存储在viewController的属性中,可能会发生保留周期,因此它会拥有一个保留它的块...这不是imho所发生的事情。
现在你的问题,我认为,来自UIImage。我取决于你在块中做了什么,但是如果你存储图像,那么每2秒创建一个新的,然后它最终会失败。您应该保留已经下载的图像缓存,并且只在需要时尝试下载它们...添加一个NSDictionary,其中url作为键,UIImage作为值,例如,这样您只需下载一次图像。
答案 1 :(得分:0)
好的,我应该睡在这个......这个功能实际上正如它应该的那样工作,self.photos
正在不受限制地增加。限制该数组的大小可以修复“泄漏”。