我最近将我的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似乎都不喜欢它...我怎样才能摆脱这些警告?
答案 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