代码之家  ›  专栏  ›  技术社区  ›  RanLearns

找不到内存泄漏

  •  1
  • RanLearns  · 技术社区  · 14 年前

    我有一个相当简单的应用程序,它在程序主要所在的视图中包含以下内容:

    int currentPageIndex;
    NSArray *images;
    NSString *nextImage;    
    IBOutlet UIImageView *firstPage;
    IBOutlet UIButton *bigButton;   
    

    在实现viewdidload中,我用一组图像文件名加载数组:

    images = [NSArray arrayWithObjects:@"image1.jpg", @"image2.jpg", etc, nil];
    [images retain];
    

    每次点击BigButton时,图像都会发生变化:

    - (IBAction)bigButtonTapped:(id)sender {
        currentPageIndex++;
    
        nextImage = [images objectAtIndex:currentPageIndex];
        firstPage.image = [UIImage imageNamed:nextImage];
    }
    

    一切都按我想要的方式工作,除了我收到一个“收到的记忆警告”。在我的设备插入的控制台中,级别=1“。此警告在每12张左右的图像后出现,最终会与“exc_bad_access”崩溃。

    我认为这实际上是一个不将任何东西放入内存的好方法,因为屏幕上只有一个uiImageView,它的图像会根据需要进行更改。

    这是一个非常简单的应用程序,所以我相信修复是非常简单的…你知道我会忽略什么吗?非常感谢!!

    5 回复  |  直到 14 年前
        1
  •  1
  •   Codo    14 年前

    由于收到内存警告,问题一定是没有释放图像。但是,在显示的代码中,您正确地处理了图像。所以问题很可能出现在你没有给我们展示的代码中。

    唯一的小问题是,前面提到过的,是 当前页索引 最终将指向数组范围之外。但这将导致另一个错误。

        2
  •  1
  •   roydell Clarke    14 年前

    为了避免超过数组的大小,

    当前页面索引=0;

    for(图像中的currentpageindex){

    道格斯;

    }

    哦!!!!!!!我想 我发现了你的问题。每当使用uiimage imagename加载图像时,所有图像都将保留在memmory中,即使释放对它的引用。使用其他uiimage方法:contentoffile。

    另一件事是,确保您的图像是为iOS优化的。当posibile时使用.png。

    DIbU2Z

        3
  •  0
  •   Idan    14 年前

    我假设图像是保留的财产。 试着在你按下大按钮的开头释放它。

    希望它有帮助。

        4
  •  0
  •   Henry Balanon    14 年前

    可能是您已经到达数组的末尾,并且正在尝试访问数组的末尾。你可以做一个

    currentPageIndex++;
    
    if ( currentPageIndex < [images count]) {
    nextImage = [images objectAtIndex:currentPageIndex];
    firstPage.image = [UIImage imageNamed:nextImage];
    }
    

    也可能是您列出的图像不在包中。

        5
  •  0
  •   Jerry Jones    14 年前

    这里没有足够的信息来确定你的问题是什么。exc_bad_访问通常在尝试访问已解除分配的对象时发生。

    找到exc_bad_访问真正原因的最快方法是使用nszombieEnabled可执行参数,然后在objc_exception_throw上设置断点。这将为您提供一个堆栈跟踪,并允许您具体确定要访问的对象。

    http://www.cocoadev.com/index.pl?NSZombieEnabled

    Using Malloc to debug