2

我有一个奇怪的问题。我目前正在开发一个邮件应用程序,它曾经随机崩溃而没有错误或登录到我的控制台。我检查了我的崩溃日志,它向我显示了内存不足的警告,并在我的应用程序旁边写了抛弃。崩溃报告

所以我怀疑这是一个内存问题,并回去跟踪我的应用程序的内存使用情况。我使用分配工具来检测整体使用情况,当它的堆大小仅为 4.59 MB 时,我的应用程序崩溃了。仪器快照

Instruments 指向我正在使用 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。如果这不是内存问题,为什么我的崩溃记者会在我的 App name 旁边显示被抛弃。

罪魁祸首([appDelegate showHUDActivityIndicatorOnView:self.parentViewController.view whileExecuting:@selector(refreshInBackground) onTarget:self withObject:nil withText:@"Loading"])

每次我调用此函数时,都会增加一些内存,因为某些元素被缓存。但是当内存达到 4.5 MB ...这条线导致它崩溃

如何找到此问题的根本原因。我如何弄清楚为什么 iOS 正在杀死我的应用程序被抛弃的原因写在我的应用程序旁边

任何帮助或建议将不胜感激。

4

2 回答 2

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 顶部的子子视图的数量都有一个上限......苹果应该在他们的文档中提到这一点......

于 2012-06-18T16:32:23.370 回答
0

如果您不使用 ARC,则每次分配属性时肯定会发生泄漏:

self.HUD = [[MBProgressHUD alloc] initWithView:view] ;

以这种方式更改您的代码:

MBProgressHUD *progressHUD = [[MBProgressHUD alloc] initWithView:view] ;
self.HUD = progressHUD;
[progressHUD release];
于 2012-06-17T11:22:04.320 回答