iphone - 为什么 Three20 会做一些奇怪的事情,导致 Xcode 4.2 出现问题?

标签 iphone ios xcode three20

我最近将我的 Xcode 版本升级到了 4.2 - 现在它从 Three20 源中给出了大量警告/问题 - 我所说的大量警告是指大约 30 个警告。

他们中的大多数似乎如下:

Property access result unused - getters should not be used for side effects.



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

我可以继续下去。

但是为什么three20会这样做呢? - 只是调用一个 getter 而不用它做任何事情似乎很奇怪 - 它是某种初始化吗?

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

最佳答案

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

一个 UIViewController派生对象通常不会加载实际 View ,直到它被迫这样做。通常,一旦将该 View 添加到 super View /窗口中。

通过以这种方式引用 View Controller 的 View ,您可以强制立即加载该 View 。

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

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

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

根据我的经验,尽管 Three20 会在 Xcode4/LLVM3 上发出疯狂的警告,但您通常不会遇到实际问题。它对我来说从来没有失败过。

关于iphone - 为什么 Three20 会做一些奇怪的事情,导致 Xcode 4.2 出现问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8865188/

相关文章:

iOS Game Center 排行榜不允许并列?

ios - 在IOS中以行和列显示数据

ios - 在数字前面加一个 + 号有什么作用?

objective-c - 重新加载数据时 MBProgressHUD 不显示

iphone - 如何更改标签栏项目文本颜色

swift - 为什么手动设置 Root View Controller 显示黑屏?

ios - 如何在 iOS 中单击按钮时正确显示/隐藏 UIView

ios - NSDateFormatter不适用于单个硬编码日期

ios - 出现键盘时向上移动 View

xcode - XCTest 函数的完整列表在哪里记录?