gpt4 book ai didi

ios - Xcode 中的头文件(包括自身)没有警告

转载 作者:行者123 更新时间:2023-11-28 22:07:00 27 4
gpt4 key购买 nike

我在我的 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。 (链接是“Here”)

问题 2:我遇到编译错误是因为我从一个不包含 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 中声明了它所以它有公共(public)访问权限,但如果你打算在 .m 中使用它, .m必须知道 @property已被定义。此外,如果您有 #import.h 中编辑了一些文件那.m需要并且您不想在 .m 中再次导入它们,您需要导入 .h (尽管将它们导入到 .m 中通常会更好。

在这里,.h简单地定义一个返回 NSString * 的方法的存在并称为 md5并且不接受任何争论。这意味着任何导入此 .h 的内容file 可以调用这个方法,Xcode 不会提示 md5方法不存在。对应.m file 实现了一种恰好匹配 .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;

关于ios - Xcode 中的头文件(包括自身)没有警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23726662/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com