收到内存警告.显示UIImagePickerController时Level = 1

wgp*_*ubs 22 iphone objective-c uiimagepickercontroller didreceivememorywarning

这真让我抓狂!!!

每当我尝试使用sourceType = UIImagePickerControllerSourceTypeCamera显示UIImagePickerController时,我都会收到"已接收内存警告.级别= 1".

这是我在viewDidLoad中设置的代码:

    - (void)viewDidLoad {

    [super viewDidLoad];

    // Set card table green felt background
    self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"green_felt_bg.jpg"]];


    // Init UIImagePickerController
    // Instantiate a UIImagePickerController for use throughout app and set delegate
    self.playerImagePicker = [[UIImagePickerController alloc] init];
    self.playerImagePicker.delegate = self;
    self.playerImagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
}
Run Code Online (Sandbox Code Playgroud)

这是我如何以模态呈现它..

- (IBAction) addPlayers: (id)sender{
[self presentModalViewController:self.playerImagePicker animated:YES];
Run Code Online (Sandbox Code Playgroud)

}

结果...... UIImagePicker开始显示然后繁荣......我得到了记忆警告......每一次!有趣的是,如果我切换到sourceType = UIImagePickerControllerSourceTypePhotoLibrary ......一切正常.

我错过了什么或做错了什么?我想做的就是显示相机,拍摄并保存图片.

仅供参考 - 我正在测试我的3GS设备.

感谢任何能提供帮助的人 :)

pro*_*rmr 17

很常见.只要您处理内存警告而不会崩溃并且有足够的空间继续运行,请不要让它让您发疯.

  • 非常感谢!简单地将所有IBOutlet设置为nil的建议通常在大多数教科书和课程中都是错误的(事实上,在-didReceiveMemory警告中你应该/不应该做的事情的描述也很糟糕). (9认同)

Nav*_*avy 6

它不是关于你的应用程序使用了多少内存,因为即使你编写一个非常简单的应用程序,只有一个视图只有一个按钮,单击按钮然后打开相机,它可能会发生.我已经在iPhone 3GS,iPad 2和iPod touch 3G上进行了测试.它只发生在iPhone 3GS上.我发现如果你在执行应用程序之前重新启动设备,它就不会再发生了.

另一个真正的解决方案是[super didReceiveMemoryWarning]在viewController中注释代码.

- (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.
}
Run Code Online (Sandbox Code Playgroud)

在使用iOS 4.3.2对iPhone 3GS进行大量测试后,我发现逻辑可能是这样的: - >打开与在背景上运行的应用程序一样多 - >呈现UIImagePickerController的imagePicker,从imagePicker单击"返回"或"保存" - > applicationDidReceiveMemoryWarning:(UIApplication *)application将调用ApplicationDelegate的方法- >然后调用ViewController的方法didReceiveMemoryWarning:- >然后调用viewDidUnload - >然后调用viewDidLoad

然后你可以找到一些已经发布的视图,并且当前视图已指向意外的视图.

默认情况下,[super didReceiveMemoryWarning]将在didReceiveMemoryWarning调用ViewController的方法时运行.谈到它,并viewDidUnload:viewDidLoad:方法将不会被调用.这意味着mem警告已被完全忽略.这就是我们的预期.


use*_*184 5

现在我升级到4.0后,它也发生在我的应用程序中 - 在3.1之前没有警告.

实际上正如你之前所说,应该没有问题.但是,这会导致再次加载后调用视图并调用viewDidLoad.这会弄乱我的应用程序,因为我在viewDidLoad中初始化视图 - 现在它再次被初始化 - 即使它不应该.

就像评论一样,这可能也会发生在许多其他只依赖加载视图一次的应用程序中!