面接問題のまとめ(二)

3771 ワード

(1)FoundationオブジェクトとCore Foundationオブジェクトの違いは?
  • FoundationオブジェクトはOCオブジェクト、Core FoundationオブジェクトはCオブジェクト
  • データ型間の変換ARC:bridge_retained(オブジェクト所有権、F->CF)、bridge_Transfer(オブジェクト所有権の解放CF->F)非ARC:_bridge

  • (2)指定したパスの下にあるすべてのファイルを再帰的に削除するための関数を作成する
    + (void)deleteFiles:(NSString *)path
    {
        //1.        
        NSFileManager *fileManager = [NSFileManager defaultManager];
        BOOL isDir = NO;
        BOOL isExist = [fileManager fileExistsAtPath:path isDirectory:&isDir];
        if (isExist) {
            //2.       
            if (isDir) {
                NSArray *dirArray = [fileManager contentsOfDirectoryAtPath:path error:nil];
                NSString *subPath = nil;
                for (NSString *str in dirArray) {
                    subPath = [path stringByAppendingPathComponent:str];
                    BOOL isSubDir = NO;
                    [fileManager fileExistsAtPath:subPath isDirectory:&isSubDir];
                    [self deleteFiles:subPath];
                }
            }else {
                NSLog(@"%@",path);
                [fileManager removeItemAtPath:path error:nil];
            }
        }else {
            NSLog(@"            ");
        }
    }
    

    (3)アップルはautoreleasepoolをどのように実現したのか.
    autoreleasepoolは1つのキュー配列の形式で実現され、主に以下の3つの関数で実現されます.
  • objc_autoreleasepoolPush
  • objc-autoreleasepoolPop
  • objc-autoreleaseは関数名を見れば分かるように、autoreleasepoolに対してそれぞれPush、Pop操作が実行されている.オブジェクトを破棄するときにrelease操作を実行します.

  • (4)objcはどのようなメカニズムでオブジェクトのメモリを管理しますか?
    オブジェクトを解放する必要があるかどうかは、カウンタのメカニズムを参照して決定されます.runloopがループを完了するたびに、オブジェクトのretainCountがチェックされます.retainCountが0の場合、オブジェクトが使用を続ける場所がないことを示し、解放できます.
    (5)メモリ管理の原則
  • このオブジェクトを使用している人がいる限り、このオブジェクトは
  • に回収されません.
  • このオブジェクトを使用したい場合は、このオブジェクトの参照カウンタに1
  • を追加する必要があります.
  • このオブジェクトを使用したくない場合は、オブジェクトの参照カウンタを1
  • 減算する必要があります.
  • 誰が作成するかは、誰がreleaseをreleaseするalloc、new、copyを通じてオブジェクトを作成する場合は、このオブジェクトを使用したくない場合はreleaseまたはautoreleaseを呼び出して参照カウンタを1減少させなければなりません.あなたが作成したものでなければ、release
  • を担当する必要はありません.
  • 誰retain,誰releaseあなたがretainを呼び出す限り、このオブジェクトがどのように生成されてもrelease
  • を呼び出す必要があります.
  • まとめ:プラスがあればマイナスがあるべきで、あるカウンタに1をプラスさせたことがあるので、最後に
  • を減らすべきだ.
    (6)UItableViewの性能が最適化されていて、スライドしているときにカードのような感じがするのはなぜですか?どうやって解決しますか?
  • サードパーティ製アプリケーションを使用する場合、パフォーマンス上の問題が頻繁に発生し、スクロール時にカード、特にcellに画像が含まれている場合に一般的に表現されます.
  • 実際に的確に最適化すればtableViewがスライドするときのカートンの問題を解決できる:
  • 1、不透明なビューを使用します.不透明なビューはレンダリング速度を向上させ、cellとそのサブビューのopaqueプロパティをYES(デフォルト)に設定できます.2、不要なcellを繰り返し作成しないでください.UItableViewは、1画面のUItableViewCellオブジェクトだけで済みます.したがってcellが表示されない場合はキャッシュし、必要に応じて使用し続けることができます.注意:cellが再利用される場合、setNeedsDisplayInRect:またはsetNeedsDisplayメソッドを呼び出してcellを再描画する必要があります.3、アニメーション効果の使用を減らすには、insertRowAtIndexPaths:withRowAnimation:メソッドではなく、reloadDataメソッドを直接呼び出すことが望ましい.4、ビューの数を減らす.CellにはtextTable、detailTextLabel、imageViewなどのviewが含まれています.また、contentViewにビューをカスタマイズして配置することもできます.作成すると、リソースが消費され、レンダリングのパフォーマンスにも影響します.5、cellには画像が含まれており、数が多く、デフォルトよりもカスタムcellを使用する速度が速い.6、ユーザーと対話する必要がない場合、CALayerを使用して、内容をlayerに描画し、cellのcontentView.Layer addSubLayer:メソッドを呼び出します.7、余計な絵を描くのはやめましょう.drawRect:を実装する場合、rectパラメータは描画する必要がある領域であり、この領域以外は描画する必要はありません.8、レイヤーを事前にレンダリングします.グラフィックコンテキストで描画し、UIImageオブジェクトとしてエクスポートし、画面に描画します.△顔が丸くなったり、変形したりした場合、グラフィックコンテキストでパフォーマンスを向上させることができます.非同期ペイント9、メインスレッドをブロックしないでください.tableViewは、データの更新時にインタフェース全体が動かず、ユーザーの要求に全く応答しません.一般的には、ネットワークリクエストであり、待ち時間は数秒です.(ソリューション:マルチスレッドを使用して、サブスレッドにこれらの関数またはメソッドを実行させる)ダウンロードスレッドの数が2を超えると、メインスレッドのパフォーマンスに著しく影響します.したがって、ユーザの要求に応答する必要がない場合、ダウンロードスレッド数を5に増やすことができ、ダウンロード速度を速めるために追加することは推奨されません.ユーザーが対話している場合は、スレッド数を2つ以内に抑える必要があります.10、heightForRowAtIndexPath呼び出しが非常に頻繁であるため、事前に高さを計算してキャッシュします.11、正しいデータ構造を選択します.ビジネスシーンに最適なデータ構造を選択することは、効率的なコードを書く基礎です.12、gzip/zip圧縮:サービス側から関連添付ファイルをダウンロードする場合、gzip/zip圧縮で十分に再ダウンロードでき、メモリが小さく、ダウンロード速度も速い.