我有一个奇怪的问题。 我目前正在开发一个邮件应用程序,它曾经随机崩溃,没有错误或登录我的控制台。我检查了我的崩溃日志,它显示了我的应用程序旁边写有抛弃的低记忆警告。
所以我怀疑这是一个内存问题,并回过头来追踪我的应用程序的内存使用情况。 我使用分配工具来检测整体使用情况,当应用程序的堆大小仅为4.59 MB时,我的应用程序崩溃了。
仪器指向我正在使用MBProgressHUD指示器的功能。 罪魁祸首就是这一行:
[appDelegate showHUDActivityIndicatorOnView:self.parentViewController.view whileExecuting:@selector(refreshInBackground) onTarget:self withObject:nil withText:@"Loading"];
如果我用它替换它
[self refreshInBackground]
一切正常,没问题。
以下是代码:
-(void) showHUDActivityIndicatorOnView:(UIView*)view whileExecuting:(SEL)method
onTarget:(id)target withObject:(id)object withText:(NSString*)label{
self.HUD = [[MBProgressHUD alloc] initWithView:view] ;
self.navigationController.navigationItem.hidesBackButton = YES;
[view addSubview:self.HUD];
self.HUD.delegate = nil;
self.HUD.labelText = label;
[self.HUD showWhileExecuting:method onTarget:target withObject:object animated:YES];
}
self.HUD
是一个保留的属性。
稍加修改showWhileExecuting
方法如下:
- (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object animated:(BOOL)animated {
MyAppdelegate *appDelegate = (MyAppdelegate *)[UIApplication sharedApplication].delegate;
if(!appDelegate.isRequestActive)
{
methodForExecution = method;
targetForExecution = [target retain];
objectForExecution = [object retain];
// Launch execution in new thread
taskInProgress = YES;
[NSThread detachNewThreadSelector:@selector(launchExecution) toTarget:self withObject:nil];
// Show HUD view
[self show:animated];
}
else {
[self done];
}
}
目前我已经从我的应用程序中删除了它,它现在工作正常,即使使用20 - 30 MB堆内存它也不会崩溃。
我不是在寻找具体的答案或解决方案。我正在寻找调试/技术来调试问题的方法,以便我可以了解导致我的应用程序崩溃的原因。
内存是否溢出。如果是这种情况那么我现在如何使用20-30 MB。 如果这不是内存问题,为什么我的崩溃记者显示我的应用程序名称旁边放弃了。
罪魁祸首专栏([appDelegate showHUDActivityIndicatorOnView:self.parentViewController.view whileExecuting:@selector(refreshInBackground) onTarget:self withObject:nil withText:@"Loading"])
每次调用此函数时,由于某些元素被缓存,因此某些内存会增加。但是当内存达到4.5 MB时......这一行导致它崩溃
如何找到此问题的根本原因。我怎么弄清楚为什么iOS会在我的应用程序旁边写下抛弃我的应用程序
任何帮助或建议都会非常感激。
答案 0 :(得分:3)
确定。问题是我正在使用我的视图添加HUD进度条
[view addSubview:self.HUD]
;
我忘了在委托方法的超级视图中将其删除:
- (void)hudWasHidden:(MBProgressHUD *)hud
{
// Remove HUD from screen when the HUD was hidded
[HUD removeFromSuperview]; // app crashes at 4.59 MB if you comment this
[HUD release];
HUD = nil;
}
因为每次在一个UIView上添加了几个视图...我猜每个UIView之上的子子视图的数量有一个上限....苹果应该在他们的文档中提到这个...
答案 1 :(得分:0)
如果您不使用ARC,则每次分配属性时都确实存在泄漏:
self.HUD = [[MBProgressHUD alloc] initWithView:view] ;
以这种方式更改您的代码:
MBProgressHUD *progressHUD = [[MBProgressHUD alloc] initWithView:view] ;
self.HUD = progressHUD;
[progressHUD release];