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

    −108

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    - (void)setValue:(NSString *)value
    {
        if(value != _value)
        {
            [_value release];
            
            if (value)
                 _value = [value retain];
        }
    
    //Тут всякие действия еще
    }

    Седьмая строка просто убила, делаем setValue:nil и в _value у нас указатель на мусор

    Запостил: notxcain, 23 Июля 2012

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

    • попытка написать правильный сеттер))
      Ответить
    • > [_value release]
      > [value retain];
      В Obj.C разве нет сборщика мусора, и приходится считать ссылки руками?
      Ответить
      • На iOS сборщика нет, управление памятью ручное, или использование технологии ARC, которая на основе name convention расставляет те же вызовы retain/release на этапе компиляции
        Ответить
    • if ([nil retain] == nil) {
      NSLog (@"Ебанулся шоле?");
      }
      Ответить
    • Может кому понадобится, самая простая реализация сеттера:
      -(void)setSomething:(id)_value
      {
      [_value autorelease];
      _value = [value retain];
      }
      Ответить
      • Простая и неправильная. Попробуйте сделать
        [obj setSomething:[obj getSomething]];
        Ответить
        • Опечатка. В сигнатуре метода должно быть просто value без подчеркивания.
          Ответить
          • А, пардон. Тут авторелиз. Если бы был просто релиз, и если бы у объекта был retainCount == 1, то после [_value release] (а мы присваиваем свойство самому себе) у нас бы уничтожился присваиваемый объект.
            Ответить

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