Xcode在头文件(包括自身)上没有警告

lazi74

我在iOS项目UIImage中加入了处理PDF的广泛使用的类别,并遇到了一些编译错误。这就提出了几个问题。

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

在类别文件中,NSString+MD5.h我发现:

#import "NSString+MD5.h"

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

对应的.m不包含.h(链接为“此处”)

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

感谢您对此基本C主题的任何解释。

写作

首先,在Objective-C中,我们#import与有所不同#include虽然#include将尝试包括您列出的任何文件,但#import绝不会重复导入任何文件。我想这可以解释为什么.h文件尝试#import自身没有问题该文件本身不能正确导入,但是由于它是一个#import,因此实际上不会引起任何问题。


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

在这里,.h简单地定义了返回an的方法的存在,该方法NSString *被调用md5并且不带参数。这意味着任何导入此.h文件的人都可以调用此方法,并且Xcode不会抱怨该md5方法不存在。相应的.m文件实现了一种与所.h定义的方法相匹配的方法如果删除了.m文件,则程序几乎可以肯定仍然可以编译……但是当您到达md5被调用的位置时,您遇到了无法识别的选择器异常,尽管Xcode对此没有抱怨。随着.m该项目,这个异常是打不到。该程序在运行时确定要执行哪种方法。


最后,至于不包括在内Foundation.h,Xcode创建的每个iOS项目都具有#import Foundation.h#import UIKit.h在预编译的头文件中。项目中具有这些导入功能的任何其他文件都只是多余地导入了该文件,因为该文件已经由导入了.pch,但是由于#import(vs #include的神奇之处,实际上并没有进行两次导入。

如果您正在使用的iOS项目中没有这些导入.pch,那么最好的选择就是将它们放在.pch

如果由于某种原因而反对这样做,则修复此md5文件的最佳方法是使用以下简单的代码行:

@import Foundation.NSString;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章