将 uiimage 设置为 nil 不会使用 ARC 释放内存

Mar*_*rty 5 uiscrollview uiimageview uiimage ios automatic-ref-counting

我有一个滚动视图,它在滚动页面时显示不同的图像,例如 PhotoScroller。我正在使用 ARC。当有人滚动到另一个页面时,我将当前未显示的 UIImageView 的图像属性设置为 nil,因为(试图)避免内存崩溃,这种情况仍在发生。然后当用户滚动到一个新页面时,该页面的图像被设置为 UIImageView 的图像属性,以及它之前和之后的页面(为了平滑查看)。页面的 UIImage 都保存在一个数组中。然而,当我滚动页面时,内存使用量不断增加,好像将 UIImageView 的image属性设置为 nil 并没有从内存中释放它。我initWithContentsOfFile用来初始化我的 UIImages。我试着用imageNamedimageWithContentsOfFile也没有运气。这是我的滚动视图代码:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
int indexShown = self.scrollView.bounds.origin.x / kScrollObjWidth;

for(NSNumber *index in indexesToRemove)
{
    UIImageView *imgViewToRemove = [[self.scrollView subviews] objectAtIndex:[index intValue]];
    imgViewToRemove.image = nil;
}
[indexesToRemove removeAllObjects];

UIImageView *imgViewToReplace = [[self.scrollView subviews] objectAtIndex:indexShown];
[imgViewToReplace setImage:[pageUIImagesArr objectAtIndex:indexShown]];
[indexesToRemove addObject:[NSNumber numberWithInt:indexShown]];

if(indexShown != 0 && ![[[self.scrollView subviews] objectAtIndex:indexShown-1] image])
{
    imgViewToReplace = [[self.scrollView subviews] objectAtIndex:indexShown-1];
    [imgViewToReplace setImage:[pageUIImagesArr objectAtIndex:indexShown-1]];
    [indexesToRemove addObject:[NSNumber numberWithInt:indexShown-1]];
}
if(indexShown != kNumImages-1 && ![[[self.scrollView subviews] objectAtIndex:indexShown+1] image])
{
    imgViewToReplace = [[self.scrollView subviews] objectAtIndex:indexShown+1];
    [imgViewToReplace setImage:[pageUIImagesArr objectAtIndex:indexShown+1]];
    [indexesToRemove addObject:[NSNumber numberWithInt:indexShown+1]];
}

currentView = [[self.scrollView subviews] objectAtIndex:indexShown];
//check which view is being shown`
Run Code Online (Sandbox Code Playgroud)

And*_*rew 2

页面的 UIImage 全部保存在一个数组中。

当您将的属性设置为时UIImage,不会释放 的,因为数组仍保留对它们的引用。至于内存增长,可能是分配了其他东西。我建议使用 Instrument 的对象分配工具来跟踪滚动时到底增长了什么。UIImageViewnil

  • 对于任何想知道的人来说,我最终所做的是将 uiimages 数组替换为保存图像路径的 nsstrings 数组,然后在我需要它们时加载图像,这样当我将它们设置为 nil 后处理完毕后,没有人提及他们。 (6认同)