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 <direct-reference-to-protocol>
也许吧,就像:
@interface XYZAppDelegate:UIResponder
发布于 2013-12-16 07:11:30
要在类上指定协议,编译器需要知道它。唯一做到这一点的方法是指定
@protocol MyProtocol
...
@end这也适用于类,类别,任何事情。
编译器和任何C编译器一样,逐个文件地处理文件。它能够也不会记得它在运行过程中看到的任何东西。这意味着,为了能够知道MyProtocol是什么,编译器必须在相同的文件中提供与上述相同的协议定义。
因为总是把事情指定一百万次是很烦人的,几十年前C人就知道,如果有预处理指令在指令所在的地方插入一个特定的文件,那就太好了。这是#include出生的时候。
#import与#include基本上是一样的,只是它还检查文件以前是否包含过,并且没有像#include那样多次执行。两种方法都只需接受文件,并假装该文件的全部内容都位于指令的位置--仅此而已。
由于C和Objective都没有框架级名称空间,编译器所知道的每个符号都可以而且必须通过指定其名称来使用。您可能从Java (如. )或其他编程语言中知道的名称空间的.语法之类的东西并不存在。
发布于 2013-12-15 21:56:18
你也许想看看这个What is the difference between #import and #include in Objective-C?
当然,你可以
#import <UIKit/UIApplication.h>
#import <UIKit/UIResponder.h>而不是
#import <UIKit/UIKit.h>然而,我可以看到这样的一些缺点。如果苹果会及时将UIApplicationDelegate协议声明移至另一个标头,该怎么办?如果您需要在一些文件中使用10个UIKit类呢?你会写信吗?
#import <UIKit/UIView.h>
#import <UIKit/UIScrollView.h>
#import <UIKit/UIButton.h>
...
#import <UIKit/header_over_9kth.h>但是,您可以在这里尝试优化导入和编译时间报告。如果您能通过这样的优化获得更多的性能,那将是很有趣的。
https://stackoverflow.com/questions/20599636
复制相似问题