Как я могу убедиться, что объект завершил инициализацию перед его использованием? - PullRequest
3 голосов
/ 13 июля 2010

Записывая Objective-C в одном методе, я вызываю +alloc, а затем -init, чтобы установить объект.

object = [[MyClass alloc] init];
[object useFor:whatever];

Следующие несколько строк кода используют только что созданный объект. Если вышеупомянутый -init займет слишком много времени, я уверен, что программа не будет «ждать», прежде чем начать использовать новый объект, не так ли? Если нет, есть ли быстрый способ убедиться, что -init завершен?

Иногда я вижу программистов, которые пишут что-то вроде

if(object = [[MyClass alloc] init]) {
    [object useFor:whatever];
}

Это то, что я должен идти?

Ответы [ 3 ]

9 голосов
/ 13 июля 2010

Когда вы вызываете init, программа не перейдет к следующей строке, пока не вернется метод init.К тому времени, как вы дойдете до второй строки, метод init завершен.Возможно, он не был успешно завершен, но он будет завершен.

Вторая форма - это тест.Сначала оператор if вызывает метод init.Если верный объект возвращается, тогда тест верен, а затем выполняется следующий оператор.Вот почему вы видите методы init, которые возвращают self, когда они успешны, и nil, когда есть проблема;чтобы подобные тесты можно было запускать, чтобы убедиться, что объект был успешно инициализирован перед продолжением.

4 голосов
/ 13 июля 2010

команды выполняются в последовательном порядке и не параллельны

(чувак, изучи основы;)

3 голосов
/ 13 июля 2010

Как правило, операторы в функциях C и Objective-C (и методах) выполняются последовательно, в порядке их написания.Если вы пишете одну вещь перед другой в функции, то первая должна завершить выполнение, прежде чем сможет выполнить следующая.

Компилятор может изменить порядок операторов, если он считает, что это не изменит поведение программы (что он может очень хорошо предсказать в ситуациях, где нет параллелизма), но это оптимизация.Стандарт C рассматривает операторы как последовательные, но позволяет компиляторам реализовывать это так, как им нравится, при условии, что поведение реальной программы такое же, как если бы операторы выполнялись в той последовательности, в которой они были написаны.

Все это долгий способ сказать: ваш init метод завершится до того, как вызывающий метод сможет возобновить выполнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...