2

奇妙な問題があります。私は現在メールアプリに取り組んでおり、以前はコンソールにエラーやログが表示されずにランダムにクラッシュしていました。クラッシュログを確認したところ、メモリ不足の警告が表示され、アプリの横に投棄が書かれていました。クラッシュレポート

したがって、メモリの問題であると思われ、アプリケーションのメモリ使用量を追跡するために戻ってきました。全体的な使用量を検出するために割り当て手段を使用したところ、ヒープ サイズがわずか 4.59 MB のときにアプリケーションがクラッシュしました。楽器のスナップショット

楽器は、MBProgressHUD インジケーターを使用している関数を指しています。犯人はこの1行です:

[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

Ok。問題は、ビューに 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;
}

このため、1 つの 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 に答える