找不到内存泄漏

时间:2010-08-24 14:23:16

标签: iphone memory ipad memory-leaks

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

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 个答案:

答案 0 :(得分:1)

由于您收到内存警告,问题必定是图像未被释放。但是,在您显示的代码中,您正确处理图像。所以问题很可能出在你没有向我们展示的部分代码中。

唯一的小问题是,之前已经提到过, currentPageIndex 最终将指向数组范围之外。但这会导致不同的错误。

答案 1 :(得分:1)

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

currentPageIndex = 0;

for(图片中的currentPageIndex){

doStuff;

}

<强> OH !!!!!我认为我发现了你的问题。每当你使用UIImage imageNamed加载图像时,即使释放对它的引用,所有图像都保留在memmory中。使用另一个UIImage方法:contentOfFile。

另外一件事,请确保您的图片针对iOS进行了优化。当有效时使用.png。

dibu2z

答案 2 :(得分:0)

我认为Image是一个保留属性。 尝试在bigButtonTapped的开头发布它。

希望它有所帮助。

答案 3 :(得分:0)

可能是你到达了数组的末尾而你正试图访问数组的末尾。你可以做一个

currentPageIndex++;

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

也可能是您列出的图像在捆绑中不存在。

答案 4 :(得分:0)

这里没有足够的信息可以确定您的问题是什么。当您尝试访问已经解除分配的对象时,通常会发生EXC_BAD_ACCESS。

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

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

Using Malloc to debug