iOSは1枚の画像をロードして崩壊の分析を招きます

2489 ワード

1、初歩的な分析


まずiPhoneは結局ハンドヘルドデバイスで、その占有するメモリは限られていて、画像が大きすぎるとメモリのクラッシュ現象を引き起こすことができます.
iPhoneの下の各appで使用可能なメモリは制限されており、1つのappで使用されるメモリが20 Mを超えると、システムはそのappにMemory Warningメッセージを送信します.このメッセージを受信した後、appは正しく処理する必要があります.そうしないと、エラーやメモリの漏洩が発生する可能性があります.

2、クラッシュ実行のプロセス分析

app Memory Warning : UIApplication::didReceiveMemoryWarning->UIApplicationDelegate::a p p l i c a tionDidReceiveMemoryWarning、現在のすべてのviewControlを呼び出して処理します.そのため、処理の主な仕事はviewControllerです. viewcontroller ,実行順序はloadview->viewDidLoadである. viewcontrollerが表示されない場合(バックグラウンドで)、didReceiveMemoryWarning->viewDidUnLoadが実行されます.viewcontrollerが現在表示されている場合(フロント)、didReceiveMemoryWarningのみが実行されます. viewController , viewDidUnLoadを実行したviewcontroller(バックグラウンドにいた)は、loadview->viewDidLoadを再呼び出します.

3、画像のロード方法の分析


**Appleの公式文書をよく見ると、UIImageオブジェクトを生成するための2つの方法で画像をロードできます.**
  • imageNamed、そのパラメータは画像の名前です.
  • imageWithContentsOfFileは、そのパラメータもピクチャファイルのパスです.

  • この2つには違いがあります.Appleの公式ドキュメントによると:imageNamed: , 。 , 。したがって、imageNameの利点は、ロード時にピクチャがキャッシュされることです.そのため、画像が頻繁に使用される場合は、imageNameの方法を使用するとよいでしょう.
    たとえば、TableViewのTableViewセルに同じアイコンをロードする必要がある場合は、imageNameで画像をロードするのが効率的です.システムはそのアイコンをメモリにCacheし、TableViewセルでその画像を利用するたびに、画像ポインタを同じメモリに向けるだけです.そのため、imageNameを使用すると、画像のデータがメモリに格納されます.iOSのメモリは非常に貴重で、メモリが消費されすぎると、メモリが強制的に解放されます.つまり、memory warningsに遭遇します.
    iOSシステムで画像のメモリを解放するのは面倒なことで、メモリが漏れる可能性があります.
    たとえば、UIViewオブジェクトのanimationImagesがUIimageオブジェクトの動的配列NSMutableArrayを装着し、フレーム単位でアニメーション化されている場合.ダイナミック配列NSMutableArrayにイメージをimageNameでロードすると、メモリが漏洩する可能性があります.理由は明らかです.imageWithContentsOfFile: , 。
    そのため、大きな画像や使用状況が少ない場合は、この方法でメモリ消費を低減することができます.
    //           UIImage   :
    NSString *path = [[NSBundle mainBundle] pathForResource:@”icon” ofType:@”png”];
    UIImage *image = [UIImage imageWithContentsOfFile:path];
    
    NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:“png”];
    NSData *image = [NSData dataWithContentsOfFile:filePath];
    UIImage *image = [UIImage imageWithData:image]; //or = [UIImage imageWithContentsOfFile:filePath];
    

    比較すると、このキーは次のとおりです.
    //imageWithContentsOfFile:     ,        
    
    //imageNamed:          ,     。
    

    最後に、二つの使い方にはそれぞれ利点があることを改めて強調し、具体的な応用シーンに対して使用する必要がある.