没有自我保留周期?

时间:2016-08-10 10:38:30

标签: ios objective-c automatic-ref-counting retain-cycle

我的内存泄漏似乎来自保留周期。每次运行此代码时,内存分配大小都会增加:

- (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.photosNSMutableArray

self.photoIndexNSInteger

SDWebImageManager是一个维护良好的图书馆:https://github.com/rs/SDWebImage我在许多其他位置使用它而没有任何问题

2 个答案:

答案 0 :(得分:1)

即使您在完成块中使用self,我也不会在此处看到任何涉及保留周期的问题。块所有者是SDWebImageManager所以这里没有问题。如果将块存储在viewController的属性中,可能会发生保留周期,因此它会拥有一个保留它的块...这不是imho所发生的事情。

现在你的问题,我认为,来自UIImage。我取决于你在块中做了什么,但是如果你存储图像,那么每2秒创建一个新的,然后它最终会失败。您应该保留已经下载的图像缓存,并且只在需要时尝试下载它们...添加一个NSDictionary,其中url作为键,UIImage作为值,例如,这样您只需下载一次图像。

答案 1 :(得分:0)

好的,我应该睡在这个......这个功能实际上正如它应该的那样工作,self.photos正在不受限制地增加。限制该数组的大小可以修复“泄漏”。