Почему Three20 делает странные вещи, которые вызывают проблемы в Xcode 4.2? - PullRequest
1 голос
/ 15 января 2012

Я недавно обновил свою версию XCode до 4.2 - и теперь она дает массу предупреждений / проблем из источника Three20 - и под нагрузкой предупреждений я имею в виду около 30 предупреждений.

Большинство из них выглядит следующим образом:

Результат доступа к свойству не используется - геттеры не должны использоваться для побочных эффектов.

Вот несколько примеров из одного файла в источнике Three20:

TTMessageController.m - строка 542

- (NSString*)subject {
  self.view; // << warning here
  for (int i = 0; i < _fields.count; ++i) {
    id field = [_fields objectAtIndex:i];
    if ([field isKindOfClass:[TTMessageSubjectField class]]) {
      UITextField* textField = [_fieldViews objectAtIndex:i];
      return textField.text;
    }
  }
  return nil;
}

TTMessageController.m - строка 556

- (void)setSubject:(NSString*)subject {
  self.view; // << warning here
  for (int i = 0; i < _fields.count; ++i) {
    id field = [_fields objectAtIndex:i];
    if ([field isKindOfClass:[TTMessageSubjectField class]]) {
      UITextField* textField = [_fieldViews objectAtIndex:i];
      textField.text = subject;
      break;
    }
  }
}

TTMessageController.m - строка 576

- (void)setBody:(NSString*)body {
  self.view; // << warning here
  _textEditor.text = body;
}

Я мог бы продолжать ... и дальше.

Но , почему это делает три20? - Кажется странным просто вызывать геттер и ничего не делать с ним - это какая-то инициализация?

Что бы это ни было - Xcode 4.2, похоже, не нравится ... как я могу избавиться от этих предупреждений?

Ответы [ 2 ]

3 голосов
/ 15 января 2012

Добавление self.view к этим методам гарантирует, что представление действительно загружено и инициализировано.

Производный объект UIViewController обычно не будет загружать фактическое представление, пока его не заставят это сделать.Обычно, когда это представление добавляется в суперпредставление / окно.

Обращаясь к представлению контроллера представления таким образом, вы принудительно загружаете это представление.

Three20 делает это в установщиках и получателях свойств для обхода ошибочного потока программы.

Предположим, что он этого не делал, и давайте также предположим, что вы вызываете один из этих сеттеров / получателей до того, как представление (и его подпредставления) будут инициализированы.В результате, например, метод setBody: попытается присвоить данную строку объекту nil.Он не будет аварийно завершать работу, но также не будет иметь никакого эффекта.

Однако такой способ работы с контроллерами представления приводит к обходу при отложенной загрузке подключенных представлений.В целом, не нужно беспокоиться, это будет работать должным образом, но я бы всегда рекомендовал не делать это так, как это делает Three20.Не сопротивляйтесь «исправлению» этих предупреждений, удаляя эти строки, поскольку Three20 сам полагается на эти побочные эффекты своих методов получения.Согласно комментарию от xlc0212, вы можете, однако, изменить эти строки на [self view];, результат останется, но предупреждения исчезнут.

По моему опыту, хотя Three20 будет выдавать предупреждения как сумасшедшие на Xcode4 / LLVM3вы, как правило, не должны сталкиваться с реальными проблемами.Это никогда не подводило меня.

2 голосов
/ 17 января 2012

Нет необходимости исправлять эти проблемы самостоятельно. Все предупреждения о компиляторе в 320 были исправлены в последней ветке разработки.

Вы можете скачать ветку разработки здесь: https://github.com/facebook/three20/tree/development

...