2016-01-24 68 views
0

當我爲第一個for循環設置了一個斷點時,我注意到它正在執行,但是這個值沒有被更新爲字符串「Viki」。相反,它只是NULL。異步塊給NULL

另外,代碼NSLog(@"Mahal");的最後一行未被執行。爲什麼?

NSMutableArray *arr1; 
    for(int i=0; i<3; i++) 
    { 
     [arr1 addObject:@"Viki"]; 
    } 

    NSLog(@"Hello"); 
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
        NSLog(@"Taj"); 
     for(int i=0; i<3; i++) 
     { 
      NSLog(@"%@", [arr1 objectAtIndex:i]); 
     } 
     dispatch_sync(dispatch_get_main_queue(), ^{ // 2 
      NSLog(@"Mahal"); // 3 
     }); 
    }); 
+0

用下面的代碼替換第一行的代碼: NSMutableArray * arr1 = [[NSMutableArray alloc] init]; –

+0

@BabuLal另外,最後一行NSLog(@「Mahal」);沒有被執行。你能告訴我爲什麼? – Viki

+0

您應該使用dispatch_async而不是dispatch_sync。 –

回答

1

您沒有初始化arr1指向一個實際的數組對象。你只聲明瞭指針變量,你從來沒有把它指向任何東西。它默認爲nil,所有到nil的消息都返回nil(或其他適合該類型的零值結果)。

您可能已經發現,您曾記錄過arr1的值。

+0

我已經使用斷點記錄了arr1的值,但是我無法識別這個缺陷。 謝謝! – Viki

+0

但是,最後一個'NSLog(@「Mahal」);'沒有被執行。你能告訴我爲什麼? – Viki

+0

如果您顯示的代碼正在從主線程運行,那麼您創建了一個死鎖。主線程運行你的代碼並調用'dispatch_sync()'。 'dispatch_sync()'會一直等到它發出的任務完成。這可以防止主線程執行任何操作。您提交的任務最終調用'dispatch_sync()'將另一個任務提交給主線程提供服務的主隊列。這個調用也一直等到任務運行完成,但由於主線程正在等待第一個任務,所以甚至無法啓動。 –