Xcode基于模板生成此头文件:
// this file is XYZAppDelegate.h
#import <UIKit/UIKit.h>
@interface XYZAppDelegate : UIResponder <UIApplicationDelegate>
....
@end
为了让编译器弄清楚 UIApplicationDelegate 是什么,这是怎么回事?
(1)导入了整个 UIKit 框架( UIKit.h )。
(2) UIApplication.h 是 UIKit.h 中指定的众多头文件中的一个。
(3)然后在 UIApplication.h 中指定 UIApplicationDelegate 协议。
为了我的理解,我可以写一个:
@interface XYZAppDelegate:UIResponder&lt; direct-reference-to-protocol &gt;
也许,例如:
@interface XYZAppDelegate:UIResponder&lt; UIKit.UIApplication.UIApplicationDelegate &gt;
答案 0 :(得分:2)
您可能想要查看What is the difference between #import and #include in Objective-C? 当然,你可以
#import <UIKit/UIApplication.h>
#import <UIKit/UIResponder.h>
而不是
#import <UIKit/UIKit.h>
但是,我可以通过这种方式看到一些缺点。如果Apple将UIApplicationDelegate
协议声明按时移动到另一个标题怎么办?如果您在某些文件中需要10个UIKit课程怎么办?你会写吗
#import <UIKit/UIView.h>
#import <UIKit/UIScrollView.h>
#import <UIKit/UIButton.h>
...
#import <UIKit/header_over_9kth.h>
但是,您可以尝试优化导入并在此处发布编译时间报告。如果您通过这种优化获得更高的性能,那将会很有趣
答案 1 :(得分:2)
要在类上指定协议,编译器需要知道它。唯一的方法是指定
@protocol MyProtocol
...
@end
课程,类别,任何事情都是如此。
与任何C编译器一样,编译器按文件处理文件。它可以也不会记住它在运行之间看到的任何东西。这意味着,为了能够知道MyProtocol是什么,必须在同一个文件中为编译器提供上面的协议定义。
因为总是指定事物一百万次会非常烦人,C人们几十年前已经想到,如果有预处理器指令在指令所在的地方插入特定文件,那将会很棒。这是#include
出生的时候。
#import
与#include
基本相同,只是它还检查文件是否已包含在之前,而不是像#include
那样多次执行。两者都只是拿起文件并假装该文件的全部内容都在指令的位置 - 仅此而已。
由于C和Objective-C都没有框架级命名空间,编译器已知的每个符号都可以而且必须通过指定其名称来简单地使用。您可能从Java(如.
)或其他编程语言中了解的System.out.println()
命名空间语法不存在。