GCDフェイス質問

今日は、これらの日の出会いをプログラミング--GCD少数のインタビューの質問を説明する。質問は、基本的な概念とGCDの使用について非常にエレガントな、非常に良好でした。

基本的な概念については、私のブログは、インタビューの質問に、この章のショーを説明するために、先に言われてきました。私たちは、GCDに関する私の基本的な説明を見ることができます  https://www.cnblogs.com/guohai-stronger/p/9038567。 HTML

コアプログラムは、実行が最終的に説明するために、当社の直接タイトルを実行するためにキューに入れられますGCDキュー派遣、派遣ブロックです:

例1 [1] GCDフェイス質問

- (ボイド)のviewDidLoad { 
    [スーパーのviewDidLoad]。
    【自己testGCD]。
}

 - (ボイド)testGCD {
     // 并行队列 
    dispatch_queue_tキュー= dispatch_queue_create(" ZXY " DISPATCH_QUEUE_CONCURRENT)。
    NSLog(@ " 1 " );
    dispatch_async(キュー、 ^ { 
        のNSLog(@ " 2 " );
         dispatch_async(キュー、 ^ { 
            のNSLog(@" 3 " )。 
        })。
        NSLog(@ " 4 " ); 
    }); 
    NSLog(@ " 5 " ); 
}

説明

  1. キューを初めて目が作成され、並列キュー、待ち時間なしに、
  2. まずプリント、その後、その後、全体のコードセグメントdispatch_asyncものと見られてdispatch_asyncを、見て、並列キュー、および待機しない、コンテンツを実行した後、再び次のことを実行まわりdispatch_asyncもの、以下の内容を、。
  3. プリントアウトに続いて、プリントが再びdispatch_async全体のコードセグメントを実行する実行、5印刷の内容内部参照、ある dispatch_async、及び4を印刷
       NSLog(@ "2"); 
        dispatch_async(キュー、^ { 
                のNSLog( "3" @); 
            }); 
        NSLog(@ "4");
  4. また、dispatch_async、及び非同期で実行、バック4、並列キューを印刷するので、それは最初の印刷実行される4
  5. 4プリントアウトを行った後、実行される3

スクリーンショットの検証結果

 

[実施例] 2つのGCD顔質問2

- (ボイド)のviewDidLoad { 
    [スーパーのviewDidLoad]。
    【自己testGCD]。
}

 - (ボイド)testGCD {
     //串行き队列 
    dispatch_queue_tキュー= dispatch_queue_create(" ZXY " DISPATCH_QUEUE_SERIAL)。
    NSLog(@ " 1 " );
    dispatch_async(キュー、 ^ { 
        のNSLog(@ " 2 " );
         dispatch_sync(キュー、 ^ { 
            のNSLog(@" 3 " )。 
        });
        NSLog(@ " 4 " ); 
    }); 
    NSLog(@ " 5 " ); 
}

説明:

  1. まず、シリアルキューは唯一の順序で実行されます
  2. まず、プリントアウト1を 、そして dispatch_async遅く実行をされるコンテンツのスレッドを開きます、次の印刷を実行5 
  3. プリントアウト5 dispatch_async内部に戻り、次に、非同期実行スレッドがオープンになり、そして(「2」@)のNSLogを発見し、 dispatch_syncyは、(「4」@)のNSLog同期実行され 、 そしてその後、プリントアウト2 
  4. 外dispatch_asyncので、2の後にプリントアウトしてのNSLog(@「4」)を歩き始め、再び同期のNSLogの内側(@「3」)、その後、我々はdispatch_syncyはのNSLogの内側に同期している同期実行は、完全な実行されませんですました(「3」@)、その双方が、その結果、互いを待っているように、(「4」@)のNSLogを移動することができないデッドロック
  5. プログラムでは、クラッシュ

スクリーンショットの検証結果

 [例] 3つのGCD面質問3

キュー= dispatch_queue_create dispatch_queue_t(" ZXY " DISPATCH_QUEUE_CONCURRENT); 
    dispatch_async(キュー、 ^ { 
        のNSLog(@ " HA 1。" ); 
    }); 
    dispatch_async(キュー、 ^ { 
        のNSLog(@ " HA 2 " ); 
    }); dispatch_sync(キュー、
     ^ { 
        のNSLog(@ " HA 3。" ); 
    }); 
//////////////////// のNSLog(
@ " HA 0 " )。 dispatch_async(キュー、 ^ { のNSLog(@ " HA 7。" ); }); dispatch_async(キュー、 ^ { のNSLog(@ " HA 8。" ); }); dispatch_async(キュー、 ^ { のNSLog(@ " HA 9 " ); });

1230789 1237890 B C D 3120798 2137890 3012789 C

1が正しい答えの5種類、上記?

説明:

  1. 最初は、並列キューDISPATCH_QUEUE_CONCURRENT、タスクの並列実行であります
  2. 後者の3前に、このコードは、実行するために完全に不可能で実装されていないので、同期は、上記HA 1及び2は、非同期ヘクタールであるが、場合HA実行が終了しているが、3ヘクタールで行われます3 0ハッハッハ直ちに実行される実行は、7,8,9 0を実行する前に発生しにくいです
  3. A、C、Eが可能であるから判断することができます

以下のようにして得られたのXcodeを実行するために、上記のコードは次のとおりです。Eの答えを

[実施例] 4つの4 GCD顔質問

私たちは、DISPATCH_QUEUE_SERIALを変更DISPATCH_QUEUE_CONCURRENTます

因为将并行队列改为串行队列,所有任务按部就班执行,所以结果如下(不加以讲解)

 

【例5】GCD面试题5

- (void) testGCD{
    __block NSInteger a = 0;
    while (a < 100) {
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            a++;
            NSLog(@"%ld======%@", a, [NSThread currentThread]);
        });
    }
    NSLog(@"卧槽无情%ld", a);
}

讲解:

  1. 首先不可能打印出0,因为有while循环,while不走完,是不可能走后面的.a = 0, 然后进入while循环, 因为是异步,所以就会开启线程执行a ++ , 可能开出的线程状态不好,所以a可能继续为0, ……
  2. 但是在某个时刻,可能线程64状态返回,执行a++, 所以a = 1 ,……
  3. 所以a的最后值是大于等于100(>=100)

可能状态还不错,从上面看出结果为100

 

拓展 下面有几道同样的类似GCD面试题目,结果给大家,大家自己体会

【例6】GCD面试题6

- (void) testGCD2 {
    dispatch_queue_t queue = dispatch_queue_create("zxy", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"1");
    dispatch_async(queue, ^{
        NSLog(@"2");
        dispatch_sync(queue, ^{
            NSLog(@"3");
        });
        NSLog(@"4");
    });
    NSLog(@"5");
}

结果如下:

【例7】GCD面试题7

- (void) testGCD2 {
    dispatch_queue_t queue = dispatch_queue_create("zxy", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"1");
    dispatch_async(queue, ^{
        NSLog(@"2");
        dispatch_async(queue, ^{
            NSLog(@"3");
        });
        NSLog(@"4");
    });
    NSLog(@"5");
}

结果如下:

【例8】GCD面试题8

- (void) testGCD2 {
    dispatch_queue_t queue = dispatch_queue_create("zxy", DISPATCH_QUEUE_SERIAL);
    NSLog(@"1");
    dispatch_async(queue, ^{
        NSLog(@"2");
        dispatch_async(queue, ^{
            NSLog(@"3");
        });
        NSLog(@"4");
    });
    NSLog(@"5");
}

结果如下:

 

以上就是GCD的经典面试题,其实看了这几道面试题,发现还都是GCD的基本内容,串行队列,并行队列,以及同步异步是否开启线程的基本概念,希望通过本次讲解,大家对GCD的认识会更上一层,谢谢!!!

おすすめ

転載: www.cnblogs.com/guohai-stronger/p/11900622.html