[英]iPhone App Crashes due to Low Memory but works fine in simulator
[英]iphone app crashes due to Low Memory but works fine in simulator
親愛的所有人,我有一個基於導航的應用程序,帶有大約60個UIControllerViews,分為4個部分。
我已經執行以下操作:1.構建和分析:bulid成功,沒有任何抱怨。 2.儀器分配和泄漏:無泄漏。
但是,該應用程序在iPhone或iPad上崩潰了,但在模擬器中運行良好。 沒有崩潰報告,但是我在crashreporter文件夾中確實看到LowMemory.log。
我已將iPhone和iPad升級到4.2
有誰知道可能出什么問題? 我已經閱讀和故障排除了一個星期。
是否需要刪除/釋放UIControllerViews? 只需在視圖之間導航即可使應用程序崩潰。
感謝您的任何幫助。
我的應用程序有一個名為contentViewController的根視圖,用戶可以從此處導航到4個測驗。
這是我用來返回到根視圖的代碼。
- (void)goHome {
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle: @"Warning"
message: @"Proceed?"
delegate: self
cancelButtonTitle:@"Yes"
otherButtonTitles:@"No",nil];
[alert show];
[alert release];
}
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
[[self navigationController] setNavigationBarHidden:NO animated:YES];
if (buttonIndex == 0) {
NSArray * subviews = [self.view subviews];
[subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
self.view = nil;
if (self.contentViewController == nil)
{
ContentViewController *aViewController = [[ContentViewController alloc]
initWithNibName:@"ContentViewController" bundle:[NSBundle mainBundle]];
self.contentViewController = aViewController;
[aViewController release];
}
[self.navigationController pushViewController:self.contentViewController animated:YES];
}
else {
}
}
該模擬器不會為您提供有關內存警告的任何有用信息,您的應用在此運行,可以有效訪問系統願意提供的所有內存。 該設備是您需要測試內存使用情況的地方,如果您收到警告和崩潰的信息,那么您需要做一些文書工作以弄清楚您可以在哪里釋放部分內存。
查看您的xcode控制台。 如果收到大量內存不足警告,則需要動態分配和取消分配視圖,因為它們占用了設備過多的內存(模擬器的內存並不十分有限)。
但這可能是造成您崩潰的其他原因之一。 確保您正在執行調試構建(打開斷點),以便調試器啟動,並希望您可以看到崩潰發生在堆棧中的哪個位置。
您已經有了一些好的建議。 但是,我建議您花大量時間復查XCode的調試工具文檔。 這樣您就可以基本了解它們的功能以及如何使用它們。 在此之后,可以閱讀有關iOS內存管理,自動釋放池等的內容。
對於您的應用程序,您需要意識到iOS設備上沒有交換空間。 因此,您不得不在其他平台上無法達到的程度來管理內存。 通常,這意味着您可以避免在內存中保留過多的查看數據。
對於當前的iPad,該應用程序可能只有約110MB的可用RAM。 具體數字可能取決於iOS版本。 無論如何,您都需要了解各種視圖的數據結構(在內存中)的大小。 根據內存使用情況,可能會大量考慮60種不同的視圖,如果管理不正確,可能很快就會用完。 這不像用Java或其他垃圾收集語言進行編程。
最后; 即使這聽起來像是內存管理問題,也可能總是其他原因。 如果仍然有問題,則需要發布代碼。 現在,真的是我們的工作了。 請記住,您沒有虛擬機,也沒有垃圾回收。
您正在用完內存,請始終記住如果分配內存,則必須釋放它,在某些情況下,您可以使用自動釋放,這樣您就不會忘記在void dealloc方法結束之前釋放它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.