【问题标题】:No warning in Xcode on header file including itselfXcode 中的头文件(包括自身)没有警告
【发布时间】:2014-05-18 20:43:24
【问题描述】:

我在我的 iOS 项目中包含了一个广泛使用的 UIImage 类别来处理 PDF,但出现了一些编译错误。这提出了几个问题。

Q1:为什么 Xcode(或者实际上是 LLVM 编译器)不会对包含自身的头文件发出任何警告?我不知道这在 C 或 Objective-C 中是否有特殊含义,可以防止它被视为错字?在我的示例中,我认为这是一个错误,Foundation.h 可能是预期的包括:

在分类文件NSString+MD5.h我找到了:

#import "NSString+MD5.h"

@interface NSString(MD5)
- (NSString *)MD5; 
@end

对应的.m 不包括.h。 (链接为“Here”)

Q2:我收到编译错误,因为我从一个不包含 Foundation 框架(iOS 的 AVCam 3.1)的 Apple 项目开始!所以NSString 是未定义的。我对此感到有些困惑,但与 xcode 中的基础框架链接就像包括其所有标头一样?我至少会再次收到警告?

感谢您对这个可能非常基本的 C 主题的任何解释。

【问题讨论】:

  • Q2:你检查过Prefix.pch吗?
  • 检查pch文件,每个模板项目的基础和uikit都在那里导入。
  • @bigblackdot 和 pawan,确实 Prefix.pch 在大多数项目(不是 AVCam)上都有基础和 UIKit,这说明了这一点。

标签: ios objective-c xcode objective-c-category


【解决方案1】:

首先,在Objective-C中,我们#import,与#include不同。虽然#include 会尝试包含您列出的任何文件,但#import 绝不会重复导入任何文件。我想这解释了为什么 .h 文件尝试 #import 本身没有问题。文件自己导入是不正确的,但因为它是#import,它实际上不会导致任何问题。


至于.m文件不导入它是.h,在这种情况下,它实际上并不需要。出于习惯,始终导入.h 文件是一个好主意,Xcode 生成的任何文件都会自动执行此操作,但这并不总是必要的。仅当.h 文件声明了.m 必须知道的内容时才需要。例如,您打算使用的 @property。您已经在.h 中声明了它,因此它具有公共访问权限,但如果您打算在.m 中使用它,.m 必须知道@property 已被定义。此外,如果您在.h 中添加了.m 需要的一些文件,并且您不想在.m 中再次导入它们,那么您需要导入.h(虽然通常将它们导入.m 会更好。

这里,.h 只是定义了一个返回 NSString * 的方法的存在,该方法被称为 md5 并且不带任何参数。这意味着任何导入这个.h 文件的东西都可以调用这个方法并且Xcode 不会抱怨md5 方法不存在。对应的.m 文件实现了一种与.h 定义的方法恰好匹配的方法。如果你删除了.m 文件,你的程序几乎肯定仍然可以正常编译……但是当你到达md5 被调用的地步时,你会遇到一个无法识别的选择器异常——尽管Xcode 没有抱怨它。使用项目中的.m,不会遇到此异常。程序在运行时计算出要执行的方法。


最后,至于不包括Foundation.h,Xcode创建的每个iOS项目的预编译头文件中都有#import Foundation.h#import UIKit.h。项目中使用这些导入的任何其他文件只是冗余导入文件,因为它已经由 .pch 导入,但由于 #import(与 #include)的魔力,它实际上并没有双重导入。

如果您使用的 iOS 项目在 .pch 中没有这些导入,最好的办法是将它们粘贴在 .pch 中。

如果您出于某种原因反对此操作,修复此md5 文件的最佳方法是使用以下简单行:

@import Foundation.NSString;

【讨论】:

  • 感谢您对导入/包含的解释!还有 .pch。
猜你喜欢
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-06
  • 2015-10-09
  • 2015-11-22
  • 2010-09-16
  • 1970-01-01
相关资源
最近更新 更多