Каков Ваш предпочтительный кодирующий стиль для dealloc в Цели-C? [закрытый]

Я знаю, что дискуссии о кодировании стилей имеют тенденцию заканчиваться в бедствии и бесконечных войнах пламени, но это не то, чего я хочу достигнуть. В течение прошлого десятилетия я главным образом видел два различных кодирующих стиля для dealloc методы в Цели-C. Первый и наиболее распространенный должен был поместить dealloc в нижней части файла. Это - также стиль использование Apple в шаблонах XCode по умолчанию. Логика позади этого, кажется, это dealloc призван, когда конец подходов объекта, таким образом, конец файла, кажется, хорошая метафора.

С другой стороны, несколько человек склонны помещать dealloc непосредственно ниже @synthesize директивы. У этого есть два главных недостатка, по-моему:

  1. Верхняя часть файла загромождена скучным кодексом.
  2. Более трудно найти основные части в Вашем классе, Вы должны прокрутить вниз.

Огромное преимущество, по-моему, состоит в том, что у Вас есть прямая визуальная связь между свойствами и передачей release сообщение.

Другая вещь - niling, уже выпустил переменные. В то время как я не думаю, что это необходимо, особенно в контексте объекта, где целая переменная разрушена после dealloc концы, я ухаживаю к также нолю за переменными. Я используюсь, чтобы сделать это для переменных в объеме функции, таким образом, я просто согласовываюсь со своим кодирующим стилем.

Это - то, как большинство моих классов похоже:

@implementation Bar

@synthesize foo;

- (void)dealloc
{
  [foo release], foo = nil;

  [super dealloc];
}

// Initializers and other methods…

Я уже упомянул несколько за и против. Что Вы думаете об этой теме? Каково кодирование, разрабатывают Вас использование в dealloc и почему? Есть ли другие за и против, которые я забыл упоминать?

Я не хочу начинать войну пламени здесь. Я просто хочу знать то, что разрабатывает Вас использование и если у Вас есть определенные причины этого или если это не имеет значения для Вас в конце.

11
задан Rafael Bugajewski 25 January 2010 в 15:15
поделиться

6 ответов

Мне нравится поставить DEALOC реализацию ниже инициализации. Таким образом, когда я добавляю новую переменную экземпляра, я не забываю в выпуск , он сразу после I init .

Кроме того, я нахожу это действительно полезным для использования Директивы #Pragma Директива , чтобы облегчить просматривать файл. Так что я «группирую» init init и DEALOC методы вместе под заголовком под названием «Инициализаторы». При просмотре файла, наличие этих заголовков, упрощает намного проще найти то, что вы ищете без отвлечения Dealoc .

Это может быть скучный код, но человек это важно.

16
ответ дан 3 December 2019 в 01:24
поделиться

Я положил его внизу. Это позволяет мне просто ударить и идти к нему, когда добавляю что-то, что нужно deaillocation. Я также не хочу, чтобы это его синтезаторы недвижимости, потому что это обманчиво . Не все, что я делаю, обязательно имеет синтезированный доступ к нему. Черт возьми, это даже не обязательно все в инициализаторе. Если я попытаюсь использовать ярлык таким образом, я, вероятно, испортил это.

3
ответ дан 3 December 2019 в 01:24
поделиться

Не устанавливайте свой ивар в DEALOC, если у вас нет конкретной причины. Он не обслуживает цели и в лучших масках программистов, которые вы будете лучше узнать о том, что скрываются.

10
ответ дан 3 December 2019 в 01:24
поделиться

Я поставил свой Dealoc на вершине, именно под директивами @synTheSize. Это немного неуклюжем и скучный код, но OH-SO-важный код, поэтому он получает высшие счета. Кроме того, возможность сравнения между свойствами и -ресами жизненно важно.

5
ответ дан 3 December 2019 в 01:24
поделиться

Возможно, можно вычислить кривизну. Если значение кривизны велико, скорость замедляется. http://en.wikipedia.org/wiki/Curvature

-121--3367045-

При добавлении нового сообщения вызовите scrollRectToVisible () в JList с помощью Rectangle , имеющего те же размеры, что и предпочтительный размер панели сообщений. Учитывая вертикальную ориентацию, может быть удобно сделать предпочтительный размер JScrollPane JViewport интегральным кратным высоте панели сообщений. См. также: Использование панелей прокрутки .

Добавление: Это убедительное обсуждение Прокрутки текстовой области также может быть полезным.

-121--2650682-
- (id)init{
   self = [super init];
   if( self ) {
      someVar = [[NSMutableArray alloc] init];
      // something like the following shouldn't be released:
      someString = [NSString stringWithFormat:@"ANumber: %d",10];
   }
   return self;

   - (void)dealloc{
       [someVar release]; someVar = nil;
       [super dealloc];
   }

именно так я это и делаю:)

-1
ответ дан 3 December 2019 в 01:24
поделиться

Мой заказ:

  1. Синтезы и @динамичные директивы (я начал делать это сверху примерно в 2011 году; ранее они были в реализации аксессора)
  2. Методы класса (+load, +initialize, +sharedFoo, другие)
  3. Инициализаторы
  4. dealloc
  5. завершают
  6. Реализации пользовательских аксессоров
  7. Методы соответствия протокола, сгруппированные по протоколу (обычно с директивами #pragma mark)
  8. Методы обработчики уведомлений (обычно объявляются в расширении класса вверх)
  9. Другие методы (обычно объявляются в расширении класса вверх)

В методе dealloc:

  • Не использовать сообщения об аксессуарах, неявные (доступ к свойствам) или явные. Любой нечистый пользовательский аксессуар может быть небезопасен при обращении к частично удаленному объекту. (То же самое относится и к инициализаторам)
  • Не устанавливайте ivars в nil. Объект частично деблокирован; почему вы все еще посылаете ему сообщения? (Если нет, то ничто не смотрит на значения ivars.)
  • (Если как-то уместно установить ivars на nil) Не злоупотребляйте оператором запятой. В выражении типа [foo release], foo = nil смешиваются типы (сначала void из выражения сообщения, затем id из выражения присваивания). Это отдельные операторы; запишите их как таковые.

  • [super dealloc] всегда последняя и всегда имеет пустую строку над ней, подчеркивая ее наличие.

Конечно, у меня также включено "Обращаться с предупреждениями как с ошибками", так что если я забуду [super dealloc], то сломаю свой билд.

8
ответ дан 3 December 2019 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: