2016-01-24 40 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()'将另一个任务提交给主线程提供服务的主队列。这个调用也一直等到任务运行完成,但由于主线程正在等待第一个任务,所以甚至无法启动。 –