1. Objective C / Говнокод #13626

    −79

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    - (id)init
    {
        if (nil != (self=[super init]))
        {
        }
        return self;
    }

    Мастер Йода

    Запостил: clockworkman, 19 Августа 2013

    Комментарии (25) RSS

    • Как сказал Шариков, сорвав кран в квартире у Преображенского - "ни пса не видно!"
      В чём соль, обжективщики?
      Ответить
      • Ни в чем, кроме того, что человек запихнул все в одну строку.

        Стандартный вариант:
        -(id)init
        {
        self = [super init];
        if(self)
        {
        }
        return self;
        }
        Ответить
        • В чем смысл пустого условия?
          Ответить
          • Судя по всему там могла быть Ваша реклама
            Ответить
          • Там, видимо, какой-нибудь код для инициализации полей втыкается. Просто вместо понятного комментария оставили блок пустым, вводя народ в заблуждение.
            Ответить
            • Понятно, а я сначала думал, может таким образом (самой проверкой) можно получить исключение в каких-то случаях.

              P.S. А у ОПа судя по комменту "Магистр Йода" вообще были претензии только к йодовскому условию, где первой идёт константа nil?
              Ответить
              • Ну тут скорее не к йодовскому, а к тому, что все в кучу.
                Ответить
            • Когда-то это шаблон выглядел так:

              -(id)init
              {
                  if(self = [super init])
                  {
                      // Your code where
              
                  }
                  return self;
              }
              Ответить
              • Блин, меня постоянно смущает этот self = xxx. init в ObjectiveC это особый метод, и только он может такое делать?

                Причем ладно был бы он класс-методом с плюсиком, тогда было бы все очевидно - обычная фабрика. Но тут же его помечают как инстанс метод...
                Ответить
                • В Ocj-C (да и в C тоже, если я верно помню) оператор "=" помимо выполнения самого присваивания возвращает в качестве результата присвоенное значение.
                  То есть можно писать
                  a = b = c = 3;

                  Единственное, я не уверен в приоритете операций в данной записи.
                  Соответственно результат присваивания можно использовать в любой операции. Конкретно в init'е проверяется не вернул ли [super init] значение nil.

                  Сам init - самый обычный рядовой метод, с точки зрения синтаксиса, просто по соглашениям его (или вариации - initWithFrame, initWithDecoder) принято использовать в качестве инициализирующей функции.
                  Ответить
                  • > помимо выполнения самого присваивания возвращает в качестве результата присвоенное значение
                    Да это то все понятно. Меня смущало именно присваивание self.
                    Ответить
                • А, видимо я не понял вопроса. Нет, self можно переписать откуда угодно. Но не нужно ;)
                  Как я уже писал, Obj-C выглядит так, как будто он реализован поверх C дефайнами.
                  Ответить
                • Только метод, название которого начинается со слова init, может вызывать self = [super init], да.
                  Про инстанс метод - зато в Obj-C аллокатор является класс-методом (правда, он только память выделяет и возвращает id, так что фабрикой назвать его нельзя никак).
                  Ну и да, многие девелоперы (и я, да) для своих классов пишут статические фабрики.
                  Ответить
                  • Т.е. фактически мы выделяем кусок памяти через alloc, а потом вызываем у этого еще неинициализированного куска init, и он заполняет поля и т.п.? Ну тогда имеет смысл.

                    Правда меня все равно пугает self = xxx. Ну как-то это неестественно.
                    Ответить
                    • Именно так.
                      Ответить
                      • А можно в self засунуть не результат [super init], а результат alloc'а к примеру? Или запилить таким образом синглтон, всегда засовывая в self и возвращая одно и то же...
                        Ответить
                        • Можно конечно, и то, и то - id, все прекрасно вернется. Получишь объект, у которого ни одно поле не выставлено. Не могу представить, зачем тебе этого хочется.
                          Про синглтон идеи не понял.
                          Обычно он делается по-старинке - статик инстанс.
                          Ответить
                          • Чистый сингтон от статика отличается чуть меньше чем ничем.
                            Ответить
                          • > Не могу представить, зачем тебе этого хочется.
                            Для удовлетворения извращенных фантазий :) Например в зависимости от параметров вернуть другой объект, являющийся потомком текущего.

                            > Про синглтон идеи не понял.
                            Ну вот тот самый статик инстанс возвращать из init'а. Чтобы внешний код не знал, что это синглтон.

                            P.S. Не обращайте внимания на мои странные мысли и идеи, это на меня годы работы с крестами так влияют ;)
                            Ответить
                            • > Ну вот тот самый статик инстанс возвращать из init'а. Чтобы внешний код не знал, что это синглтон.

                              Тащемта так правоставные синглтоны в Obj C и пишутся. По идее надо перекрывать все методы, через которые можно получить второй инстанс или поменять retain count самого синглтона, это init, autorelease, retain, release, и даже сам alloc.
                              Редко кто так заморачивается, пишут просто фабрику sharedInstance и все.
                              Ответить
                              • Слава ARC и GCD, теперь достаточно написать в ините "dispatch_once", и менее православным такой синглтон не станет.
                                Ответить
                                • В том то и беда, что ARC решит только проблему с retain count, не позволяя его самостоятельно поменять, а GCD с dispatch_once хоть штука и полезная при создании синглтонов, но не защитит от создания второй инстанс, если его добавить, как вы написали, в инит. Я же все еще могу послать alloc или allocWithZone и получить еще один полноценный объект, пусть и не инициализированный.
                                  Ответить
                                  • Конечно же я имел ввиду не в инит, а в геттер инстанса.
                                    Заработался.
                                    Ответить
                            • > Например в зависимости от параметров вернуть другой объект, являющийся потомком текущего.
                              В стандартной библиотеке так и запилено, конструкторы многих классов возвращают приватных наследников.

                              > Ну вот тот самый статик инстанс возвращать из init'а. Чтобы внешний код не знал, что это синглтон.
                              Можно запилить статический конструктор с приватным init-ом, а в стандартном init-е бросать исключение.
                              Ответить
    • автар не смог в приоритет операторов.
      Ответить

    Добавить комментарий