Iphone EXC_内存警告后的错误访问
在收到内存警告后,我的应用程序出现EXC_BAD_访问问题。 这就是我测试的方式: 我编写了一个简单的应用程序,它只分配内存,不释放内存。在分配了大量内存后,只剩下大约14MB的可用内存,我切换到我的主应用程序。我立即在didReceiveMemoryWarning中收到一条记忆警告。片刻之后,我的应用程序在一个在UIButton中设置图像的函数中崩溃:Iphone EXC_内存警告后的错误访问,iphone,ios,memory-management,uiimage,didreceivememorywarning,Iphone,Ios,Memory Management,Uiimage,Didreceivememorywarning,在收到内存警告后,我的应用程序出现EXC_BAD_访问问题。 这就是我测试的方式: 我编写了一个简单的应用程序,它只分配内存,不释放内存。在分配了大量内存后,只剩下大约14MB的可用内存,我切换到我的主应用程序。我立即在didReceiveMemoryWarning中收到一条记忆警告。片刻之后,我的应用程序在一个在UIButton中设置图像的函数中崩溃: -(void)activateRecordButton { UIImage *image = [UIImage imageNamed:
-(void)activateRecordButton
{
UIImage *image = [UIImage imageNamed:@"audioRecordOn"];
[recButton setImage:image forState:UIControlStateNormal];
}
我得到的错误是调用setImage的行上的EXC_BAD_ACCESS(code=1,address=some_address)。
如果我对这些行进行注释,我的应用程序将在另一个为UIButton设置图像的函数中崩溃
这是我的didReceiveMemoryWarning:
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
为什么会这样?这是因为没有更多的内存来加载图像,还是因为recButton在另一个应用程序分配了大量内存时以某种方式被释放
我运行的是Iphone 4 ios 5.1.1UIViewController默认情况下将在
didReceiveMemoryWarning
中释放其视图(如果可能)。如果您没有手动保留按钮,按钮也将被释放
然后对不存在的对象调用
setImage
,这将触发EXC\u BAD\u访问
是,可能recButton被解除分配。你在用弧吗?不,我没有用弧。那么在这种情况下我应该怎么做呢?从头开始重新创建视图?如何创建按钮?它是IBOutlet吗?所有视图都应该在viewDidUnload方法中释放,并在中重新创建viewDidLoad@Diurpaneus此按钮是否在viewDidLoad
中创建?由于按钮是使用类型为(aretainCount
为零)的按钮创建的,因此当您将其添加到视图时,它将被保留,但当视图被删除时,按钮将被释放。因此,如果您没有在viewDidLoad
中创建此按钮,则该按钮将在您身上释放,但在视图重新加载时不会重新创建。您是对的。在“viewDidUnload”中,您必须将所有视图(按钮、标签等)设置为“nil”)/更重要的是,他必须在viewDidLoad
中重新创建按钮。