我有一个相当简单的应用程序,在程序主要使用的视图中有以下内容:
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,它的图像会根据我的需要进行更改。
这是一个非常简单的应用程序,所以我确定修复非常简单...任何想法我可能会忽略?非常感谢!!
答案 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上设置断点。这将为您提供堆栈跟踪,并允许您具体确定您尝试访问的对象。