Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone EXC_内存警告后的错误访问_Iphone_Ios_Memory Management_Uiimage_Didreceivememorywarning - Fatal编程技术网

Iphone EXC_内存警告后的错误访问

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:

在收到内存警告后,我的应用程序出现EXC_BAD_访问问题。 这就是我测试的方式: 我编写了一个简单的应用程序,它只分配内存,不释放内存。在分配了大量内存后,只剩下大约14MB的可用内存,我切换到我的主应用程序。我立即在didReceiveMemoryWarning中收到一条记忆警告。片刻之后,我的应用程序在一个在UIButton中设置图像的函数中崩溃:

-(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.1

UIViewController默认情况下将在
didReceiveMemoryWarning
中释放其视图(如果可能)。如果您没有手动保留按钮,按钮也将被释放


然后对不存在的对象调用
setImage
,这将触发
EXC\u BAD\u访问

是,可能recButton被解除分配。你在用弧吗?不,我没有用弧。那么在这种情况下我应该怎么做呢?从头开始重新创建视图?如何创建按钮?它是IBOutlet吗?所有视图都应该在viewDidUnload方法中释放,并在中重新创建viewDidLoad@Diurpaneus此按钮是否在
viewDidLoad
中创建?由于按钮是使用类型为(a
retainCount
为零)的按钮创建的,因此当您将其添加到视图时,它将被保留,但当视图被删除时,按钮将被释放。因此,如果您没有在
viewDidLoad
中创建此按钮,则该按钮将在您身上释放,但在视图重新加载时不会重新创建。您是对的。在“viewDidUnload”中,您必须将所有视图(按钮、标签等)设置为“nil”)/更重要的是,他必须在
viewDidLoad
中重新创建按钮。