Потому что тогда испытание зависит от состояния гонки. Два разных потока могут независимо проверять, что foo
равно nil
, а затем (последовательно) создавать отдельные экземпляры. Это может произойти в вашей модифицированной версии, когда один поток выполняет тест, в то время как другой все еще находится внутри +[Foo alloc]
или -[Foo init]
, но еще не установил foo
.
Кстати, я бы так не поступил. Проверьте функцию dispatch_once()
, которая позволяет вам гарантировать, что блок выполняется только один раз за время существования вашего приложения (при условии, что у вас есть GCD на целевой платформе).