为什么Three20做了导致Xcode 4.2问题的奇怪事情?

时间:2012-01-14 20:36:39

标签: iphone ios xcode three20

我最近将我的Xcode版本升级到了4.2 - 现在它正在从Three20源代码中发出一连串的警告/问题 - 并且通过大量警告我的意思是大约30个警告。

其中大多数似乎如下:

  

未使用属性访问结果 - 不应将getter用于副作用。

以下是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;
}

我可以继续......等等。

为什么有三个人这样做? - 只是打电话给一个吸气剂而不做任何事情似乎很奇怪 - 这是某种初始化吗?

无论是什么 - Xcode 4.2似乎都不喜欢它...我怎样才能摆脱这些警告?

2 个答案:

答案 0 :(得分:3)

向这些方法添加self.view将确保实际加载和初始化视图。

UIViewController派生对象通常不会加载实际视图,直到强制执行此操作为止。通常将该视图添加到superview / window后。

通过这种方式引用视图控制器的视图,可以强制立即加载该视图。

Three20在属性设置器和getter中执行此操作以解决错误的程序流程。

让我们假设它没有这样做,并且还假设您在视图(及其子视图)初始化之前调用其中一个setter / getter。因此,例如setBody:方法将尝试将给定的字符串分配给nil-object。它不会崩溃但也不会有任何影响。

然而,这种在viewcontrollers中工作的方式会导致绕过延迟加载连接的视图。总的来说,没有必要担心,它会正常工作,但我总是建议不要像three20那样做。通过删除这些线来抵制“修复”这些警告,因为Three20本身依赖于其吸气方法的这些副作用。根据xlc0212的评论,您可以将这些行更改为[self view];,结果将保留,但警告将消失。

根据我的经验,即使Three20会在Xcode4 / LLVM3上发出疯狂的警告,你通常也不会遇到现实生活中的问题。它永远不会失败。

答案 1 :(得分:2)

无需自行解决这些问题。三个中的所有编译器警告已在最新的开发分支中修复。

您可以从此处下载开发分支:https://github.com/facebook/three20/tree/development